1 Shiro核心API以及关系
首先了解一点基本的内容:
Subjrct:用户主体(登录,注销,判断授权等等一些的方法)(把操作交给SecurityManager)
SecurityManager:安全管理器(关联Realm)
Realm:Shiro连接数据的桥梁(操作查询数据库或配置文件,获取用户的信息)
2 导入对应依赖
在编写代码前,应先将所需要的依赖进行导入,这里放了shiro与spring整合依赖,其他依赖按需要进行导入。
<!-- shiro与spring整合依赖 --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.4.0</version> </dependency> |
3 新建ShiroConfig类
首先就是新建ShiroConfig配置类,并写上对应注解@Configuration
图3.1
然后是在这个配置类里需要创建三个Bean,分别是
1.ShiroFilterFactoryBean;
2.DefaultWebSecurityManager;3.Realm。
4 实现步骤
4.1
首先是Realm,先创建一个自定义的UserRealm类,在这个类是放编写一些查询的方式方法、认证授权的一些逻辑。这个类需要先继承AuthorizingRealm,会分别实现两个方法,如下(还没写认证等方法):
public class UserRealm extends AuthorizingRealm { //执行一些授权逻辑 @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { System.out.println("执行授权逻辑"); return null; }
//执行一些认证逻辑 @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { System.out.println("执行认证逻辑"); return null; } } |
4.2
然后回到Config类,写Realm Bean(不要忘记写注解!):
//3.Realm Bean @Bean(name = "Realm") public UserRealm getRealm() { return new UserRealm(); } |
4.3
接着写DefaultWebSecurityManager,用@Qualifier("Realm")将userRealm传进来:
//2.DefaultWebSecurityManager @Bean(name = "DefaultWebSecurityManager") public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("Realm")UserRealm userRealm) { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); //关联realm securityManager.setRealm(userRealm); return securityManager; } |
4.4
最后是ShiroFilterFactoryBean,在这里面就可以写需要拦截过滤或放行的页面接口,也可以修改在页面被拦截后需要跳转到的页面接口(默认页面为login.jsp):
//1.ShiroFilterFactoryBean @Bean public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("DefaultWebSecurityManager")DefaultWebSecurityManager securityManager) { ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
//设置安全管理器,关联一个securityManager,也是通过Qualifier注解拿到 shiroFilterFactoryBean.setSecurityManager(securityManager);
//添加Shiro过滤拦截器 /** *常用过滤器 * anon:无需登录(认证)可以访问 * authc:必须认证才可以访问 * user:如果使用remeberMe的功能,可以直接访问 * perms:该资源必须得到资源权限才可以访问 * role:该资源必须得到角色权限才可以访问 */
Map<String, String> filterMap = new LinkedHashMap<String, String>();
//需要过滤的东西,不拦截的放前面 filterMap.put("/add", "authc"); filterMap.put("/delete", "authc");
//修改拦截后跳转的页面 shiroFilterFactoryBean.setLoginUrl("/login");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);
return shiroFilterFactoryBean; } |
5 注意点
需要注意,容易出错的地方:
1.依赖的版本,可能程序运行出错由于版本冲突。
2.不要忘记注解的书写,如上面的@Configuration、@Bean等。
3.在最后写过滤器时,其中的接口不要留空,否则会找不到之类的报错。
4.写过滤时,放行的写在前面,拦截的写在后面。