这里写目录标题
测试结构总览
ShiroConfig Shiro配置类
@Configuration
public class ShiroConfig {
//ShiroFilterFactoryBean,3、
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("getDefaultWebSecurityManager") 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");
//授权,正常情况下,没有授权会跳转到未授权页面
filterMap.put("/user/add","perms[user:add]");
filterMap.put("/user/update","perms[user:update]");
filterMap.put("/user/*","authc");
bean.setFilterChainDefinitionMap(filterMap);
//设置登录的跳转请求
bean.setLoginUrl("/toLogin");
//设置未授权跳转请求
bean.setUnauthorizedUrl("/noauth");
return bean;
}
//DefaultWebSecurityManager,2、
@Bean
public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
//关联UserRealm
securityManager.setRealm(userRealm);
return securityManager;
}
//创建 realm 对象,需要自定义类,1、
@Bean
public UserRealm userRealm(@Qualifier("hashedCredentialsMatcher") HashedCredentialsMatcher hashedCredentialsMatcher){
UserRealm userRealm = new UserRealm();
// 设定 密码校验规则
userRealm.setCredentialsMatcher(hashedCredentialsMatcher);
return userRealm;
}
//整合 ShiroDialect ,用来整合 Shiro thymeleof
@Bean
public ShiroDialect getShiroDialect(){
return new ShiroDialect();
}
/**
* 凭证匹配器
* 密码校验交给Shiro的SimpleAuthenticationInfo进行处理
*/
@Bean
public HashedCredentialsMatcher hashedCredentialsMatcher() {
//Shiro自带加密
HashedCredentialsMatcher credentialsMatcher = new HashedCredentialsMatcher();
//散列算法使用md5
credentialsMatcher.setHashAlgorithmName("MD5");
//散列次数,1表示md5加密一次
credentialsMatcher.setHashIterations(1);
//credentialsMatcher.setStoredCredentialsHexEncoded(true);
return credentialsMatcher;
}
}
UserRealm 类
//自定义的 UserRealm extends AuthorizingRealm
public class UserRealm extends AuthorizingRealm {
@Autowired
UserService userService;
//授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
//拿到当前登录的这个对象
Subject subject = SecurityUtils.getSubject();
User currentUser = (User) subject.getPrincipal(); //拿到User 对象
//设置当前用户的权限
info.addStringPermission(currentUser.getPerms());
return info;
}
//认证
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
UsernamePasswordToken userToken= (UsernamePasswordToken) authenticationToken;
//连接真实数据库
User user = userService.queryUserByName(userToken.getUsername());
if (user==null){
//没有这个人
return null; //抛出异常 UnknownAccountException
}
// 在 Shiro 整合后的 thymeleaf页面中,判断用户是否登录
Subject subject = SecurityUtils.getSubject();
Session sessio