1 Star 0 Fork 0

lin-mt / spring-boot-shiro

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
ShiroConfig.java 4.54 KB
一键复制 编辑 原始数据 按行查看 历史
lin-mt 提交于 2020-01-27 01:38 . init commit
package com.gitee.linmt.config;
import com.gitee.linmt.realm.DatabaseRealm;
import com.gitee.linmt.util.PasswordUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authc.credential.CredentialsMatcher;
import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* @author linmt
*/
@Slf4j
@Configuration
public class ShiroConfig {
@Bean
public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
log.info("注入ShiroFilter:ShiroConfiguration.shiroFilter()");
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
shiroFilterFactoryBean.setSecurityManager(securityManager);
// 如果自己实现了登陆逻辑就不需要设置登陆 Url,如果没有自己实现的话,需要设置路径(默认:http://ip:host/login)
// shiroFilterFactoryBean.setLoginUrl("/login");
// 设置没有权限的Url,如果登陆人访问的Url在下面的拦截器中设置(如:/userInfo/getSelfInfo),如果没有权限,则自动
// 转发到该Url,如果是使用注解的方式配置的权限(如:/userInfo/userDelete),则会抛出AuthorizationException异常
// 可以使用捕获全局异常然后转发到该路径
shiroFilterFactoryBean.setUnauthorizedUrl("/unauthorized");
// 拦截器.
Map<String,String> filterChainDefinitionMap = new LinkedHashMap<>();
// 配置不会被拦截的链接 顺序判断
// 注册链接不拦截
filterChainDefinitionMap.put("/userInfo/registered", "anon");
// 登陆链接不拦截
filterChainDefinitionMap.put("/login", "anon");
// 配置退出 过滤器,其中的具体的退出代码Shiro已经替我们实现了
filterChainDefinitionMap.put("/logout", "logout");
// 需要认证并具有user:search权限才能访问
// filterChainDefinitionMap.put("/userInfo/userSearch", "authc,perms[user:search]");
// 需要拥有 user 角色才能访问
// filterChainDefinitionMap.put("/userInfo/userSearch", "authc,roles[user]");
// 过滤链定义,从上向下顺序执行,一般将/**放在最为下边 -->:这是一个坑呢,一不小心代码就不好使了;
// authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名访问
filterChainDefinitionMap.put("/**", "authc");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
return shiroFilterFactoryBean;
}
/**
* Shiro 的 SecurityManager
*
* @param databaseRealm 认证 Realm
* @param credentialsMatcher 密码处理方式
* @return SecurityManager
*/
@Bean
public SecurityManager securityManager(DatabaseRealm databaseRealm, CredentialsMatcher credentialsMatcher){
databaseRealm.setCredentialsMatcher(credentialsMatcher);
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
// 可以设置多个 Realm,Shiro 会依次进行认证,直到所有的 Realm 都认证不通过才会抛出权限认证失败异常
securityManager.setRealm(databaseRealm);
return securityManager;
}
/**
* 对密码的处理、匹配的方式
*
* @return 处理方式
*/
@Bean
public CredentialsMatcher credentialsMatcher() {
HashedCredentialsMatcher credentialsMatcher = new HashedCredentialsMatcher();
credentialsMatcher.setHashAlgorithmName(PasswordUtil.PASSWORD_ALGORITHM_NAME);
credentialsMatcher.setHashIterations(PasswordUtil.PASSWORD_HASH_ITERATIONS);
return credentialsMatcher;
}
/**
* 开启shiro aop注解支持.
* 如果使用代理方式,则需要开启代码支持;
*/
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager){
AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
return authorizationAttributeSourceAdvisor;
}
}
Java
1
https://gitee.com/lin-mt/spring-boot-shiro.git
git@gitee.com:lin-mt/spring-boot-shiro.git
lin-mt
spring-boot-shiro
spring-boot-shiro
master

搜索帮助

53164aa7 5694891 3bd8fe86 5694891