|
1 | 1 | package com.xh.basic.config; |
2 | 2 |
|
| 3 | +import com.xh.basic.shiro.CustomRealm; |
| 4 | +import org.apache.shiro.mgt.SecurityManager; |
| 5 | +import org.apache.shiro.spring.web.ShiroFilterFactoryBean; |
| 6 | +import org.apache.shiro.web.mgt.DefaultWebSecurityManager; |
| 7 | +import org.slf4j.Logger; |
| 8 | +import org.slf4j.LoggerFactory; |
| 9 | +import org.springframework.context.annotation.Bean; |
| 10 | +import org.springframework.context.annotation.Configuration; |
| 11 | + |
| 12 | +import java.util.LinkedHashMap; |
| 13 | +import java.util.Map; |
| 14 | + |
3 | 15 | /** |
4 | 16 | * @author szq |
5 | 17 | * @Package com.xh.basic.config |
6 | | - * @Description: to do ... |
| 18 | + * @Description: Shiro配置类 |
7 | 19 | * @date 2018/5/214:36 |
8 | 20 | */ |
| 21 | +@Configuration |
9 | 22 | public class ShiroConfig { |
| 23 | + |
| 24 | + private Logger logger = LoggerFactory.getLogger(ShiroConfig.class); |
| 25 | + /** |
| 26 | + * 过滤器默认权限表 {anon=anon, authc=authc, authcBasic=authcBasic, logout=logout, |
| 27 | + * noSessionCreation=noSessionCreation, perms=perms, port=port, |
| 28 | + * rest=rest, roles=roles, ssl=ssl, user=user} |
| 29 | + * <p> |
| 30 | + * anon, authc, authcBasic, user 是第一组认证过滤器 |
| 31 | + * perms, port, rest, roles, ssl 是第二组授权过滤器 |
| 32 | + * <p> |
| 33 | + * user 和 authc 的不同:当应用开启了rememberMe时, 用户下次访问时可以是一个user, 但绝不会是authc, |
| 34 | + * 因为authc是需要重新认证的, user表示用户不一定已通过认证, 只要曾被Shiro记住过登录状态的用户就可以正常发起请求,比如rememberMe |
| 35 | + * 以前的一个用户登录时开启了rememberMe, 然后他关闭浏览器, 下次再访问时他就是一个user, 而不会authc |
| 36 | + * |
| 37 | + * @param securityManager 初始化 ShiroFilterFactoryBean 的时候需要注入 SecurityManager |
| 38 | + */ |
| 39 | + @Bean |
| 40 | + public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager){ |
| 41 | + ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); |
| 42 | + //必须设置 SecurityManager |
| 43 | + shiroFilterFactoryBean.setSecurityManager(securityManager); |
| 44 | + //setLoginUrl 默认会自动寻找web工程根目录下的“/login.jsp”页面或“/login”映射 |
| 45 | + shiroFilterFactoryBean.setLoginUrl("/notLogin"); |
| 46 | + //设置无权限时跳转的url |
| 47 | + shiroFilterFactoryBean.setUnauthorizedUrl("/notRole"); |
| 48 | + |
| 49 | + //设置拦截器 |
| 50 | + Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>(); |
| 51 | + //游客,开发权限 |
| 52 | + filterChainDefinitionMap.put("/guest/**", "anon"); |
| 53 | + //用户,需要角色权限“user” |
| 54 | + filterChainDefinitionMap.put("/user/**", "roles[user]"); |
| 55 | + //管理员,需要角色权限“admin” |
| 56 | + filterChainDefinitionMap.put("/admin/**", "roles[admin]"); |
| 57 | + //开发登录接口 |
| 58 | + filterChainDefinitionMap.put("/login", "anon"); |
| 59 | + //其余接口一律拦截 |
| 60 | + //这行代码必须放在所有权限设置的最后,不然会导致所有url都被拦截 |
| 61 | + filterChainDefinitionMap.put("/**", "anon"); |
| 62 | + |
| 63 | + shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); |
| 64 | + logger.info("Shiro拦截器工厂类注入成功!"); |
| 65 | + return shiroFilterFactoryBean; |
| 66 | + } |
| 67 | + |
| 68 | + /** |
| 69 | + * 注入securityManager |
| 70 | + */ |
| 71 | + @Bean |
| 72 | + public SecurityManager securityManager(){ |
| 73 | + DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); |
| 74 | + //设置realm |
| 75 | + securityManager.setRealm(customRealm()); |
| 76 | + return securityManager; |
| 77 | + } |
| 78 | + |
| 79 | + /** |
| 80 | + * 自定义身份认证 realm |
| 81 | + * 必须写这个类,并加上@Bean注解,目的是注入CustomRealm,否则会影响CustomRealm类中其他类的依赖注入 |
| 82 | + */ |
| 83 | + @Bean |
| 84 | + public CustomRealm customRealm(){ |
| 85 | + return new CustomRealm(); |
| 86 | + } |
10 | 87 | } |
0 commit comments