org.apache.shiro
shiro-spring-boot-web-starter
1.9.1

package com.example.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;
/**
* @author CNCLUKZK
* @create 2022/8/5-19:45
*/
//自定义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;
}
}
这个配置累需要有三步操作,倒着code
第一步:创建Realm对象,需要自定义类
第二步:DefaultWebSecurityManager默认的SecurityManager安全管理器
第三步:ShiroFilterFactoryBean,在ShiroFilter里面使用shiro的内置过滤器配置请求路径,无authc认证的用户无法进入相关页面,退出到登陆页面
shiro的内置过滤器
anon:无需认证就可以访河 authc: 必须认证了才能让河 user: 必颈拥有记住我功能才能用 perms: 拥有对某个资源的权限才能访问: role: 拥有某个角色权限才能访河
- 1
- 2
- 3
- 4
- 5
package com.example.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.LinkedHashMap;
import java.util.Map;
/**
* @author CNCLUKZK
* @create 2022/8/5-19:45
*/
@Configuration
public class ShiroConfiguration {
//第三步:ShiroFilterFactoryBean
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("defaultWebSecurityManager")DefaultWebSecurityManager securityManager){
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
//设置安全管理器
shiroFilterFactoryBean.setSecurityManager(securityManager);
/*添shiro的内置过滤器,类型
anon:无需认证就可以访河
authc: 必须认证了才能让河
user: 必颈拥有记住我功能才能用
perms: 拥有对某个资源的权限才能访问:
role: 拥有某个角色权限才能访河
*/
Map filterChainDefinitionMap = new LinkedHashMap<>();
/*也可以用通配符
* filterChainDefinitionMap.put("/user/*","authc");*/
filterChainDefinitionMap.put("/user/addUser","authc");
filterChainDefinitionMap.put("/user/updUser","authc");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
//无认证权限时,设置登陆请求
shiroFilterFactoryBean.setLoginUrl("/user/toLogin");
return shiroFilterFactoryBean;
}
//第二步:DefaultWebSecurityManager
@Bean(name = "defaultWebSecurityManager")
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();
}
}
spring.thymeleaf.cache=false
前端这些页面都是简单的测试页面,其中login页面沿用springSecurity的测试用例
主页index.html
Title
首页
信息显示
添加|修改

//认证
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
System.out.println("执行了认证doGetAuthenticationInfo方法!");
//用户名密码后续会数据中取
String username = "admin";
String password = "111111";
UsernamePasswordToken userToken = (UsernamePasswordToken) token;
if (!userToken.getPrincipal().equals(username)) {
return null; //抛出UnknownAccountException异常
}
//密码认证,shiro做
return new SimpleAuthenticationInfo("",password,"");
}
@RequestMapping("/login")
public String login(String username,String password,Model model){
Subject subject = SecurityUtils.getSubject();
//全局token
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
try {
subject.login(token);
return "index";
} catch (UnknownAccountException uae) {
model.addAttribute("msg",token.getPrincipal()+" is not correct");
return "login";
} catch (IncorrectCredentialsException ice) {
model.addAttribute("msg","Password for account " + token.getPrincipal() + " was incorrect!");
return "login";
} catch (LockedAccountException lae) {
model.addAttribute("msg","The account for username " + token.getPrincipal() + " is locked. " +
"Please contact your administrator to unlock it.");
return "login";
}
}

