3万字《SpringBoot微服务开发——Shiro(安全)》

这篇具有很好参考价值的文章主要介绍了3万字《SpringBoot微服务开发——Shiro(安全)》。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Disable verbose logging

log4j.logger.org.apache.shiro.util.ThreadContext=WARN

log4j.logger.org.apache.shiro.cache.ehcache.EhCache=WARN

shiro.ini,需要安装ini插件

3万字《SpringBoot微服务开发——Shiro(安全)》,程序员,spring boot,微服务,安全

[users]

user ‘root’ with password ‘secret’ and the ‘admin’ role

root = secret, admin

user ‘guest’ with the password ‘guest’ and the ‘guest’ role

guest = guest, guest

user ‘presidentskroob’ with password ‘12345’ ("That’s the same combination on

my luggage!!!" 😉), and role ‘president’

presidentskroob = 12345, president

user ‘darkhelmet’ with password ‘ludicrousspeed’ and roles ‘darklord’ and ‘schwartz’

darkhelmet = ludicrousspeed, darklord, schwartz

user ‘lonestarr’ with password ‘vespa’ and roles ‘goodguy’ and ‘schwartz’

lonestarr = vespa, goodguy, schwartz

-----------------------------------------------------------------------------

Roles with assigned permissions

Each line conforms to the format defined in the

org.apache.shiro.realm.text.TextConfigurationRealm#setRoleDefinitions JavaDoc

-----------------------------------------------------------------------------

[roles]

‘admin’ role has all permissions, indicated by the wildcard ‘*’

admin = *

The ‘schwartz’ role can do anything (*) with any lightsaber:

schwartz = lightsaber:*

The ‘goodguy’ role is allowed to ‘drive’ (action) the winnebago (type) with

license plate ‘eagle5’ (instance specific id)

goodguy = winnebago:drive:eagle5

3、测试Quickstart

/*

  • Licensed to the Apache Software Foundation (ASF) under one

  • or more contributor license agreements. See the NOTICE file

  • distributed with this work for additional information

  • regarding copyright ownership. The ASF licenses this file

  • to you under the Apache License, Version 2.0 (the

  • “License”); you may not use this file except in compliance

  • with the License. You may obtain a copy of the License at

  • http://www.apache.org/licenses/LICENSE-2.0
    
  • Unless required by applicable law or agreed to in writing,

  • software distributed under the License is distributed on an

  • “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

  • KIND, either express or implied. See the License for the

  • specific language governing permissions and limitations

  • under the License.

*/

import org.apache.shiro.SecurityUtils;

import org.apache.shiro.authc.*;

import org.apache.shiro.config.IniSecurityManagerFactory;

import org.apache.shiro.mgt.SecurityManager;

import org.apache.shiro.session.Session;

import org.apache.shiro.subject.Subject;

import org.apache.shiro.util.Factory;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

/**

  • Simple Quickstart application showing how to use Shiro’s API.

  • @since 0.9 RC2

*/

public class Quickstart {

//日志

private static final transient Logger log = LoggerFactory.getLogger(Quickstart.class);

public static void main(String[] args) {

// The easiest way to create a Shiro SecurityManager with configured

// realms, users, roles and permissions is to use the simple INI config.

// We’ll do that by using a factory that can ingest a .ini file and

// return a SecurityManager instance:

// Use the shiro.ini file at the root of the classpath

// (file: and url: prefixes load from files and urls respectively):

Factory factory = new IniSecurityManagerFactory(“classpath:shiro.ini”);

SecurityManager securityManager = factory.getInstance();

// for this simple example quickstart, make the SecurityManager

// accessible as a JVM singleton. Most applications wouldn’t do this

// and instead rely on their container configuration or web.xml for

// webapps. That is outside the scope of this simple quickstart, so

// we’ll just do the bare minimum so you can continue to get a feel

// for things.

SecurityUtils.setSecurityManager(securityManager);

// Now that a simple Shiro environment is set up, let’s see what you can do:

// get the currently executing user:

//获取当前的用户对象 Subject

Subject currentUser = SecurityUtils.getSubject();

// Do some stuff with a Session (no need for a web or EJB container!!!)

//通过当前对象获取当前用户的Session

Session session = currentUser.getSession();

session.setAttribute(“someKey”, “aValue”);

//将aValue的session保存在someKey中

String value = (String) session.getAttribute(“someKey”);

if (value.equals(“aValue”)) {

log.info(“Subject==》session [” + value + “]”);

}

// let’s login the current user so we can check against roles and permissions:

//判断当前的用户是否被认证

if (!currentUser.isAuthenticated()) {

//Token 令牌

UsernamePasswordToken token = new UsernamePasswordToken(“lonestarr”, “vespa”);

token.setRememberMe(true);

try {

currentUser.login(token); //执行 登录操作

} catch (UnknownAccountException uae) {//未知账号

log.info("There is no user with username of " + token.getPrincipal());

} catch (IncorrectCredentialsException ice) {//密码错误

log.info(“Password for account " + token.getPrincipal() + " was incorrect!”);

} catch (LockedAccountException lae) { //锁定账号

log.info("The account for username " + token.getPrincipal() + " is locked. " +

“Please contact your administrator to unlock it.”);

}

// … catch more exceptions here (maybe custom ones specific to your application?

catch (AuthenticationException ae) { //认证异常

//unexpected condition? error?

}

}

//say who they are:

//print their identifying principal (in this case, a username):

//获取当前用户信息

log.info(“User [” + currentUser.getPrincipal() + “] logged in successfully.”);

//test a role:

//测试角色 判断当前用户是什么角色

if (currentUser.hasRole(“schwartz”)) {

log.info(“May the Schwartz be with you!”);

} else {

log.info(“Hello, mere mortal.”);

}

//test a typed permission (not instance-level)

//简单 粗粒度

if (currentUser.isPermitted(“lightsaber:wield”)) {

log.info(“You may use a lightsaber ring. Use it wisely.”);

} else {

log.info(“Sorry, lightsaber rings are for schwartz masters only.”);

}

//细粒度

//a (very powerful) Instance Level permission:

if (currentUser.isPermitted(“winnebago:drive:eagle5”)) {

log.info("You are permitted to ‘drive’ the winnebago with license plate (id) ‘eagle5’. " +

“Here are the keys - have fun!”);

} else {

log.info(“Sorry, you aren’t allowed to drive the ‘eagle5’ winnebago!”);

}

//all done - log out!

//注销

currentUser.logout();

//结束

System.exit(0);

}

}

3万字《SpringBoot微服务开发——Shiro(安全)》,程序员,spring boot,微服务,安全

这些功能在Spring-Secutiry都有

//获取当前的用户对象 Subject

Subject currentUser = SecurityUtils.getSubject();

//通过当前对象获取当前用户的Session

Session session = currentUser.getSession();

//判断当前的用户是否被认证

currentUser.isAuthenticated()

//获取当前用户信息

currentUser.getPrincipal()

//测试角色 判断当前用户是什么角色

currentUser.hasRole(“schwartz”)

currentUser.isPermitted(“lightsaber:wield”)

//注销

currentUser.logout();

6、SpringBoot整合Shiro环境搭建

导入相关依赖

org.apache.shiro

shiro-core

1.8.0

org.apache.shiro

shiro-spring

1.8.0

org.thymeleaf

thymeleaf-spring5

org.thymeleaf.extras

thymeleaf-extras-java8time

测试SpringBoot环境是否搭建成功

Title

首页


add

update

controller层

@RequestMapping({“/”,“/index”})

public String ToIndex(Model model){

model.addAttribute(“msg”,“hello Shiro”);

return “index”;

}

3万字《SpringBoot微服务开发——Shiro(安全)》,程序员,spring boot,微服务,安全

测试SpringBoot整合Shiro环境搭建成功

Shiro配置

3万字《SpringBoot微服务开发——Shiro(安全)》,程序员,spring boot,微服务,安全

package com.kk.config;

import org.apache.shiro.authc.AuthenticationException;

import org.apache.shiro.authc.AuthenticationInfo;

import org.apache.shiro.authc.AuthenticationToken;

import org.apache.shiro.authz.AuthorizationInfo;

import org.apache.shiro.realm.AuthorizingRealm;

import org.apache.shiro.subject.PrincipalCollection;

//自定义的 UserRealm extends AuthorizingRealm

public class UserRealm extends AuthorizingRealm {

//授权

@Override

protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {

System.out.println(“执行科=》授权doGetAuthorizationInfo”);

return null;

}

//认证

@Override

protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {

System.out.println(“执行科=》认证doGetAuthenticationInfo”);

return null;

}

}

ShiroConfig

package com.kk.config;

import org.apache.shiro.mgt.DefaultSecurityManager;

import org.apache.shiro.spring.web.ShiroFilterFactoryBean;

import org.apache.shiro.web.mgt.DefaultWebSecurityManager;

import org.springframework.beans.factory.annotation.Qualifier;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import java.util.HashMap;

import java.util.LinkedHashMap;

import java.util.Map;

@Configuration

public class ShiroConfig {

//ShiroFilterFactortBean 第三步

@Bean

public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier(“securityManager”) DefaultWebSecurityManager defaultWebSecurityManager) {

ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();

//设置安全管理器

bean.setSecurityManager(defaultWebSecurityManager);

return bean;

}

//DefaultWebSecurityManager 第二步

@Bean(name = “securityManager”)

public DefaultWebSecurityManager getDefaultwebSecurityManager(@Qualifier(“userRealm”) UserRealm userRealm) {

DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();

//.关联UserReaLm

securityManager.setRealm(userRealm);

return securityManager;

}

//创建 realm 对象 需要自定义 第一步

@Bean

public UserRealm userRealm() {

return new UserRealm();

}

}

MyController

package com.kk.controller;

import org.springframework.jmx.export.annotation.ManagedResource;

import org.springframework.stereotype.Controller;

import org.springframework.ui.Model;

import org.springframework.web.bind.annotation.RequestMapping;

@Controller

public class MyController {

@RequestMapping({“/”,“/index”})

public String ToIndex(Model model){

model.addAttribute(“msg”,“hello Shiro”);

return “index”;

}

@RequestMapping(“/user/add”)

public String add(){

return “user/add”;

}

@RequestMapping(“/user/update”)

public String update(){

return “user/update”;

}

@RequestMapping(“/toLogin”)

public String toLogin(){

return “login”;

}

}

index.html

Title

首页


add

update

add.html

Title

add

update.html

Title

update

7、shiro实现登录拦截

package com.kk.config;

import org.apache.shiro.mgt.DefaultSecurityManager;

import org.apache.shiro.spring.web.ShiroFilterFactoryBean;

import org.apache.shiro.web.mgt.DefaultWebSecurityManager;

import org.springframework.beans.factory.annotation.Qualifier;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import java.util.HashMap;

import java.util.LinkedHashMap;

import java.util.Map;

@Configuration

public class ShiroConfig {

//ShiroFilterFactortBean 第三步

@Bean

public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier(“securityManager”) DefaultWebSecurityManager defaultWebSecurityManager) {

ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();

//设置安全管理器

bean.setSecurityManager(defaultWebSecurityManager);

//添加shiro的内置过滤器

/*

anon : 无需认证就可以访问

authc:必须认证才能访问

user:必须拥有 记住我 功能才能用

perms 拥有某个资源的权限才能访问

role 拥有某个角色的权限才能访问

*/

Map<String, String> filterMap = new LinkedHashMap<>();

filterMap.put(“/user/add”, “authc”);

filterMap.put(“/user/update”, “authc”);

bean.setFilterChainDefinitionMap(filterMap);

//如果没有权限 ,则跳转到登陆页面

bean.setLoginUrl(“/toLogin”);

return bean;

}

//DefaultWebSecurityManager 第二步

@Bean(name = “securityManager”)

public DefaultWebSecurityManager getDefaultwebSecurityManager(@Qualifier(“userRealm”) UserRealm userRealm) {

DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();

//.关联UserReaLm

securityManager.setRealm(userRealm);

return securityManager;

}

//创建 realm 对象 需要自定义 第一步

@Bean

public UserRealm userRealm() {

return new UserRealm();

}

}

login.html

Title

登陆


用户名:

密码:

MyController

@RequestMapping(“/toLogin”)

public String toLogin(){

return “login”;

}

8、Shiro实现用户认证

MyController

@RequestMapping(“/login”)

public String login(String username,String password,Model model){

//获取当前的用户

Subject subject = SecurityUtils.getSubject();

//封装登陆用户的登陆数据

UsernamePasswordToken token = new UsernamePasswordToken(username, password);

try{

subject.login(token);//执行登陆方法,如果没有异常就说明ok

return “index”;

}catch (UnknownAccountException e){//用户名不存在

model.addAttribute(“msg”,“用户名错误”);

return “login”;

}catch (IncorrectCredentialsException e){//密码不存在

model.addAttribute(“msg”,“密码错误”);

return “login”;

}

}

login.html

Title

登陆


用户名:

密码:

UserRealm

//认证

@Override

protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {

System.out.println(“执行了=》认证doGetAuthenticationInfo”);

//用户名 密码 —数据库

String name=“root”;

String password=“123456”;

UsernamePasswordToken userToken = (UsernamePasswordToken) token;

if (!userToken.getUsername().equals(name)){

return null;//抛出异常UnknownAccountException

}

//密码认证 shiro

return new SimpleAuthenticationInfo(“”,password,“”);

}

9、Shiro整合Mybatis

导入依赖

mysql

mysql-connector-java

log4j

log4j

1.2.17

com.alibaba

druid

1.2.6

org.mybatis.spring.boot

mybatis-spring-boot-starter

2.2.0

2.连接数据库application.yml

spring:

datasource:

username: root

password: 981204

#?serverTimezone=UTC解决时区的报错

url: jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8

driver-class-name: com.mysql.jdbc.Driver

type: com.alibaba.druid.pool.DruidDataSource

#Spring Boot 默认是不注入这些属性值的,需要自己绑定

#druid 数据源专有配置

initialSize: 5

minIdle: 5

maxActive: 20

maxWait: 60000

timeBetweenEvictionRunsMillis: 60000

minEvictableIdleTimeMillis: 300000

validationQuery: SELECT 1 FROM DUAL

testWhileIdle: true

testOnBorrow: false

testOnReturn: false

poolPreparedStatements: true

#配置监控统计拦截的filters,stat:监控统计、log4j:日志记录、wall:防御sql注入

#如果允许时报错 java.lang.ClassNotFoundException: org.apache.log4j.Priority

#则导入 log4j 依赖即可,Maven 地址: https://mvnrepository.com/artifact/log4j/log4j

filters: stat,wall,log4j

maxPoolPreparedStatementPerConnectionSize: 20

useGlobalDataSourceStat: true

connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

3.设置application.properties

整合mybatis

mybatis.type-aliases-package=com.kk.pojo

mybatis.mapper-locations=classpath:mapper/*.xml

4.实体类

package com.kk.pojo;

public class User {

private int id;

private String name;

private String pwd;

public User() {

}

public User(int id, String name, String pwd) {

this.id = id;

this.name = name;

this.pwd = pwd;

}

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getPwd() {

return pwd;

}

public void setPwd(String pwd) {

this.pwd = pwd;

}

@Override

public String toString() {

return “User{” +

“id=” + id +

“, name='” + name + ‘’’ +

“, pwd='” + pwd + ‘’’ +

‘}’;

}

}

5.UserMapper

package com.kk.mapper;

import org.apache.ibatis.annotations.Mapper;

import org.springframework.stereotype.Repository;

@Repository

@Mapper

public class UserMapper {

public User queryUserByName(String name);

}

6.UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>

select * from mybatis.user where name = #{name}

7.UserService

public interface UserService {

public User queryUserByName(String name);

}

8.UserServiceImpl

package com.kk.service;

import org.springframework.stereotype.Service;

@Service

public class UserServiceImp implements UserService{

@Autowired

UserMapper userMapper;

@Override

public User queryUserByName(String name) {

return userMapper.queryUserByName(name);

}

}

9.测试查出对应User

@SpringBootTest

class ShiroSpringbootApplicationTests {

@Autowired

UserServiceImpl userService;

@Test

void contextLoads() {

System.out.println(userService.queryUserByName(“雏田”));

}

}

10、测试成功后 将数据绑定到安全配置中,再次启动配置

package com.kk.config;

import com.kk.pojo.User;

import com.kk.service.UserService;

import org.apache.shiro.SecurityUtils;

import org.apache.shiro.authc.*;

import org.apache.shiro.authz.AuthorizationInfo;

import org.apache.shiro.realm.AuthorizingRealm;

import org.apache.shiro.subject.PrincipalCollection;

import org.apache.shiro.subject.Subject;

import org.springframework.beans.factory.annotation.Autowired;

//自定义的 UserRealm extends AuthorizingRealm

public class UserRealm extends AuthorizingRealm {

@Autowired

UserService userService;

//授权

@Override

protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {

System.out.println(“执行了=》授权doGetAuthorizationInfo”);

return null;

}

//认证

@Override

protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {

System.out.println(“执行了=》认证doGetAuthenticationInfo”);

UsernamePasswordToken userToken = (UsernamePasswordToken) token;

//连接真实数据库

User user = userService.queryUserByName(userToken.getUsername());

if (user==null){ //没有这个用户

return null; //抛出异常UnknownAccountException

}

//密码认证 shiro

//可以加密 MD5加密 MD5盐值加密

return new SimpleAuthenticationInfo(“”,user.getPwd(),“”);

}

}

10、Shiro请求授权实现

1、授权正常的情况下,没有授权会跳转到未授权页面

package com.kk.config;

import org.apache.shiro.spring.web.ShiroFilterFactoryBean;

import org.apache.shiro.web.mgt.DefaultWebSecurityManager;

import org.springframework.beans.factory.annotation.Qualifier;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import java.util.LinkedHashMap;

import java.util.Map;

@Configuration

public class ShiroConfig {

//ShiroFilterFactoryBean:3

@Bean

public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier(“securityManager”) DefaultWebSecurityManager defaultWebSecurityManager) {

ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();

//设置安全管理器

bean.setSecurityManager(defaultWebSecurityManager);

/*anon:无需认 证就可以访问

authc:必须认证了 才能让问

user:.必须拥有 记住我功能才能用

perms:

拥有对某个资源的权限才能访间:

role:拥有某 个角色权限才能访问

*/

Map<String, String> filterMap = new LinkedHashMap<>();

//授权,正常的情况下,没有授权会跳转到未授权页面

filterMap.put(“/user/add”, “perms[user:add]”);

filterMap.put(“/user/update”, “perms[user:update]”);

//第二个为权限,只有persm=user:add/user:update] 才可能进入相应的页面

filterMap.put(“/user/*”, “authc”);

//filterMap.put(“/user/add”, “authc”);

//filterMap.put(“/user/update”, “authc”);

bean.setFilterChainDefinitionMap(filterMap);

//设置获录的请求

bean.setLoginUrl(“/toLogin”);

//未授权页面

bean. setUnauthorizedUrl(“/noauth”);

return bean;

}

//Dafaul tWebSecurityManager:2

@Bean(name = “securityManager”)

public DefaultWebSecurityManager getDefaultwebSecurityManager(@Qualifier(“userRealm”) UserRealm userRealm) {
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。3万字《SpringBoot微服务开发——Shiro(安全)》,程序员,spring boot,微服务,安全

3万字《SpringBoot微服务开发——Shiro(安全)》,程序员,spring boot,微服务,安全

3万字《SpringBoot微服务开发——Shiro(安全)》,程序员,spring boot,微服务,安全

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

3万字《SpringBoot微服务开发——Shiro(安全)》,程序员,spring boot,微服务,安全

最后

分布式技术专题+面试解析+相关的手写和学习的笔记pdf

还有更多Java笔记分享如下:

3万字《SpringBoot微服务开发——Shiro(安全)》,程序员,spring boot,微服务,安全

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
tWebSecurityManager) {

ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();

//设置安全管理器

bean.setSecurityManager(defaultWebSecurityManager);

/*anon:无需认 证就可以访问

authc:必须认证了 才能让问

user:.必须拥有 记住我功能才能用

perms:

拥有对某个资源的权限才能访间:

role:拥有某 个角色权限才能访问

*/

Map<String, String> filterMap = new LinkedHashMap<>();

//授权,正常的情况下,没有授权会跳转到未授权页面

filterMap.put(“/user/add”, “perms[user:add]”);

filterMap.put(“/user/update”, “perms[user:update]”);

//第二个为权限,只有persm=user:add/user:update] 才可能进入相应的页面

filterMap.put(“/user/*”, “authc”);

//filterMap.put(“/user/add”, “authc”);

//filterMap.put(“/user/update”, “authc”);

bean.setFilterChainDefinitionMap(filterMap);

//设置获录的请求

bean.setLoginUrl(“/toLogin”);

//未授权页面

bean. setUnauthorizedUrl(“/noauth”);

return bean;

}

//Dafaul tWebSecurityManager:2

@Bean(name = “securityManager”)

public DefaultWebSecurityManager getDefaultwebSecurityManager(@Qualifier(“userRealm”) UserRealm userRealm) {
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。[外链图片转存中…(img-VobvgnQs-1713053765311)]

[外链图片转存中…(img-xkslkYbr-1713053765311)]

[外链图片转存中…(img-UB15EeDP-1713053765312)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

3万字《SpringBoot微服务开发——Shiro(安全)》,程序员,spring boot,微服务,安全

最后

分布式技术专题+面试解析+相关的手写和学习的笔记pdf

还有更多Java笔记分享如下:

[外链图片转存中…(img-PYoCgCea-1713053765312)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!文章来源地址https://www.toymoban.com/news/detail-855006.html

到了这里,关于3万字《SpringBoot微服务开发——Shiro(安全)》的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • AI 时代,程序员无需焦虑 | 《服务端开发:技术、方法与实用解决方案》(文末送书福利4.0)

    ChatGPT 横空出世后,“AI 即将取代程序员” 的观点一度引发热议,至今尚未完全冷却。作为一名服务端开发工程师,同时也是 ChatGPT 的“忠实”用户,经过将近一年的使用,今天抽空写一篇文章,谈谈自己对“AI 时代,程序员何去何从?”这一问题的看法。 2022 年 11 月 30 日

    2024年02月11日
    浏览(15)
  • 017-信息打点-语言框架&开发组件&FastJson&Shiro&Log4j&SpringBoot等

    1、CMS指纹识别-不出网程序识别 2、开发框架识别-PHPPythonJava 3、开发组件识别-Java常见安全漏洞组件 解决: 1、CMS识别到后期漏洞利用和代码审计 2、开发框架识别到后期漏洞利用和代码审计 3、开发组件识别到后期漏洞利用和代码审计 演示案例: ➢指纹识别-本地工具-GotoSc

    2024年01月21日
    浏览(13)
  • 第六十四天 服务攻防-框架安全&CVE复现Apache shiro&Apache Solr

    中间件及框架列表: IIS,Apache,Nginx,Tomcat,Docker,K8s,Weblogic.JBoos,WebSphere, Jenkins,GlassFish,Jetty,Jira,Struts2,Laravel,Solr,Shiro,Thinkphp,Spring, Flask,jQuery等 1、开发框架-PHP-Laravel-Thinkphp 2、开发框架-Javaweb-St2-Spring 3.开发框架-Python-django-Flask 4、开发框架-Javascript-Node.js-JQuery 5、其他框架Java-Apache Sh

    2024年02月21日
    浏览(8)
  • SpringBoot-黑马程序员-学习笔记(三)

    目录 30.springboot整合MyBatis-plus 32.SSM整合 38.MP中的条件查询 小知识:许多放在类前面的注解,比如@Mapper,@Service都是将该类定义成一个Bean,交给spring管理 39.Service模块 1.创建普通springboot项目,勾选Mysql 框架 2.在pom包里面导入mybatis-plus的坐标 3.把数据层的类继承BaseMapper这个接口

    2024年02月07日
    浏览(11)
  • 黑马程序员SSM框架-SpringBoot

    视频连接:SpringBoot-01-SpringBoot工程入门案例开发步骤_哔哩哔哩_bilibili 入门程序 也可以基于官网创建项目。  基于阿里云创建项目 基于手工创建项目 隐藏指定文件/文件夹 SpringBoot项目快速启动 下面的插件将项目运行所需的依赖jar包全部加入到了最终运行的jar包中,并将入口

    2024年02月03日
    浏览(12)
  • 应该选择网络安全还是程序员?

    很长的时间我都在思考这个问题.,根据自己的经验和朋友们的讨论后得出了一些结论,网络安全 这个概念太广,我就以安服/渗透岗作为比较的对象,题主可以参考一下: 程序员: 优点: 1.薪资非常高,今年校招大厂普遍是24K*15 2.岗位多,无论大城市还是小城市遍地是岗位

    2023年04月19日
    浏览(30)
  • 低代码——面向程序员,帮助程序员敏捷开发

    低代码是一套可视化开发工具,它帮开发者把前后端基础功能写扎实,开发者只需要 通过填表配置或拖拽生成前端组件 的方式,即可完成后台管理系统的快速搭建。由于低代码仍需要 写少量 JS 代码 ,所以低代码开发平台主要面向程序员,帮助程序员敏捷开发。 本文使用

    2024年02月01日
    浏览(17)
  • 读程序员的制胜技笔记14_安全审查(下)

    1.2.2.1. 看不出来是什么?那我拒绝为你服务 1.4.1.1. 工作量证明相当消耗客户端的运算资源,对那些性能较低的设备不友好,并且它还会影响设备电池的使用寿命 1.4.1.2. 有可能会严重降低用户体验,其后果甚至比验证码的还要恶劣 3.5.2.1. 存储需求更少,性能更强,数据管理

    2024年02月05日
    浏览(15)
  • 读程序员的制胜技笔记13_安全审查(上)

    5.6.1.1. 任何你不想丢失或泄露的东西都是资产,包括你的源代码、设计文档、数据库、私钥、API令牌、服务器配置,还有Netflix观看清单 5.6.2.1. 每台服务器都会被一些人访问,而每台服务器都会访问其他一些服务器 6.1.1.1. 设计时首先要考虑到安全问题,因为在既有基础上去

    2024年02月05日
    浏览(17)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包