(2)、导入shiro整合springboot的包org.thymeleaf thymeleaf-spring5 org.thymeleaf.extras thymeleaf-extras-java8time
(3)、Shiro实现登陆拦截 1)、自定义后端响应org.apache.shiro shiro-spring 1.9.0
package com.example.shirospringboot.controller;
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 index(Model model) {
model.addAttribute("msg","ml");
return "index";
}
@RequestMapping("/add")
public String add() {
return "user/add";
}
@RequestMapping("/update")
public String update() {
return "user/update";
}
@RequestMapping("/toLogin")
public String toLogin(){
return "login";
}
}
2)、核心配置文件javaConfig
首先必须要在config目录下定义一个UserRealm类
package com.example.shirospringboot.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("执行了授权");
return null;
}
//认证
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
System.out.println("执行了认证");
return null;
}
}
然后将前面定义好的 UserRealm注册到容器中交给springboot托管,config目录下的ShiroConfig.java文件如下
package com.example.shirospringboot.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.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
@Configuration
public class ShiroConfig {
//1、创建Realm对象,需要自定义类,将定义好的UserRealm注册到容器中交给springboot托管
@Bean
public UserRealm userRealm() {
return new UserRealm();
}
//2、DefaultWebSecurityManager
@Bean("defaultWebSecurityManager")
public DefaultWebSecurityManager defaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm) {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
//关联Realm对象
securityManager.setRealm(userRealm);
return securityManager;
}
//3、ShiroFilterFactoryBean
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("defaultWebSecurityManager") DefaultWebSecurityManager defaultWebSecurityManager) {
ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
//设置安全管理器
bean.setSecurityManager(defaultWebSecurityManager);
//添加Shiro的内置过滤器
Map filrterMap = new LinkedHashMap<>();
filrterMap.put("/add", "authc");
filrterMap.put("/update", "authc");
bean.setFilterChainDefinitionMap(filrterMap);
//设置登陆的请求,只有登陆之后才可以访问
bean.setLoginUrl("/toLogin");
return bean;
}
}
登陆演示,点击添加页面或者更新页面发现被拦截了
被拦截之后路由跳转到登陆页面
只有认证登陆之后才能访问刚才点击的“更新页面”或者“添加页面”,拦截成功!登陆拦截代码分析
//1、创建Realm对象,需要自定义类,将定义好的UserRealm注册到容器中交给springboot托管
@Bean
public UserRealm userRealm() {
return new UserRealm();
}
这段代码是将自定义好的UserRealm类注册到容器中让spring托管
//2、DefaultWebSecurityManager
@Bean("defaultWebSecurityManager")
public DefaultWebSecurityManager defaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm) {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
//关联Realm对象
securityManager.setRealm(userRealm);
return securityManager;
}
//点开源码了可以看到,DefaultWebSecurityManager管理的类很多,不止是前面自定义好的一个
public DefaultWebSecurityManager(Realm singleRealm) {
this();
this.setRealm(singleRealm);
}
public DefaultWebSecurityManager(Collection realms) {
this();
this.setRealms(realms);
}
这段代码是让DefaultWebSecurityManager管理前面我们自己定义好的UserRealml类;点开源码了可以看到,DefaultWebSecurityManager管理的类很多,不止是前面自定义好的一个。将DefaultWebSecurityManager注册到spring容器中
//3、ShiroFilterFactoryBean
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("defaultWebSecurityManager") DefaultWebSecurityManager defaultWebSecurityManager) {
ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
//设置安全管理器
bean.setSecurityManager(defaultWebSecurityManager);
//添加Shiro的内置过滤器
Map filrterMap = new LinkedHashMap<>();
filrterMap.put("/add", "authc");
filrterMap.put("/update", "authc");
bean.setFilterChainDefinitionMap(filrterMap);
//设置登陆的请求,只有登陆之后才可以访问
bean.setLoginUrl("/toLogin");
return bean;
}
这段代码是实现拦截的根本代码。filrterMap.put("/add", "authc"); filrterMap.put("/update", "authc");设置拦截的规则,只有这两个路由会被拦截,没有使用filrterMap.put的不会被拦截。拦截之后会走向我们自己定义好的登陆认证页面,没有登陆认证是不可能访问到想要的页面的。但是我们需要注意的是在Shiro中没有提前定义好的登陆页面供我们使用,这个拦截之后的登陆页面必须我们自己写!这个和springSecurity是不同的。然后将ShiroFilterFactoryBean注册到spring中供我们使用!
(4)、Shiro实现用户认证


