shiro 是一个比较流行的权限管理框架,下面咱们来看怎么将他应用到咱们本身的项目里面。html
第一步:找到maven 依赖。java
<dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.3.2</version> </dependency>
第二步:自定义一个 realm 进行身份认证。web
public class DemoRealm extends AuthorizingRealm{ @Override public boolean supports(AuthenticationToken token) { return token instanceof JwtToken; } @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { System.out.println("身份认证开始~"); JwtToken userToken = (JwtToken) token; String username = JwtUtil.getUsername(userToken.getToken()); String password = "tianba.0821"; if(username == null || "".equals(username.trim())) { throw new AccountException("token不正确"); } if(!"yuxiong".equals(username)) { throw new AccountException("用户名不正确"); } if(!JwtUtil.verify(userToken.getToken(), username, password)) { throw new AccountException("密码不正确"); } return new SimpleAuthenticationInfo(userToken.getToken(),userToken.getToken(),getName()); } @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { System.out.println("认证权限开始~"); System.out.println(principals.getPrimaryPrincipal()); //String username = (String) SecurityUtils.getSubject().getPrincipal(); SimpleAuthorizationInfo info = new SimpleAuthorizationInfo (); Set<String> set = new HashSet<>(); set.add("user"); info.setRoles(set); return info; } }
我这里采用简单的jwt 认证 也没有跟数据库交互,若是须要也是须要咱们本身写查询在realm中去认证。spring
第三步:添加shiro的核心配置数据库
import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; import javax.servlet.Filter; import org.apache.shiro.mgt.SecurityManager; 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 com.example.demo.shiro.DemoRealm; import com.example.demo.shiro.JwtFilter; @Configuration public class ShiroConfig { @Bean public DemoRealm demoRealm() { // 建立 realm实例 return new DemoRealm(); } @Bean public SecurityManager securityManager(DemoRealm demoRealm) { // 建立 SecurityManager实例 DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(demoRealm); return securityManager; } @Bean public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) { // 初始化ShiroFilterFactoryBean ShiroFilterFactoryBean factory = new ShiroFilterFactoryBean(); factory.setSecurityManager(securityManager); factory.setUnauthorizedUrl("/user/notRole"); // 设置未认证的跳转路径 Map<String,Filter> filters = new HashMap<>(); filters.put("perms",new JwtFilter()); // 添加自定义过滤器 factory.setFilters(filters); // 设置过滤器 Map<String, String> map = new LinkedHashMap<>(); map.put("/swagger-ui.html", "anon"); // swagger-ui.html 访问界面 map.put("/swagger-resources/**", "anon"); // swagger-ui.html 访问界面 map.put("/v2/api-docs/**", "anon"); // swagger-ui.html 访问界面 map.put("/webjars/**", "anon"); // swagger-ui.html 访问界面 map.put("/visitor/**", "anon"); // 设置此路径不须要认证 map.put("/user/**", "roles[user]"); // 设置访问此路径须要 user 权限 map.put("/admin/**", "roles[admin]"); // 是个访问此路劲须要 admin权限 map.put("/login/**", "anon"); // 设置此路劲不须要认证 map.put("/**", "perms"); // 添加自定义过滤器 factory.setFilterChainDefinitionMap(map); // 设置拦截路径 return factory; } }
番外篇:简单读一下 ShiroFilterFactoryBean的原码。apache
一进来就看见咱们 在 shiro核心配置文件中配置的内容了,securityManage,自定义的 filter ,咱们定义的拦截的路径 filterChainDefinitionMap,已经设置的登陆路径,登陆成功路径,未认证的路径。这是否是就很清楚的解释了 咱们为何须要配置这些配置项目啊,由于须要,哈哈哈哈。api
而后咱们一块儿来看几个方法。框架
这个方法 就是将咱们的拦截器配置 封装到 DefaultFilterChainManager 类中 ,而后咱们再读一下 DefaultFilterChainManager 类maven
是否是也有 咱们刚刚封装进了的 参数两个 map 。 而后 FilterConfig 这个类来自 javax.servlet 包,对 filter 进行配置。ide
而后在 DefaultFilterChainManager 类中的 addFilter 方法中进行 filter 的初始化