1.概述
2.认证和记住我
3.建议
4.实现
权限配置:
package com.yang.shiro.factory; import java.util.LinkedHashMap; public class FilterChainDefinitionBulider { public LinkedHashMap<String, String> filterChainDefinitionMethod(){ LinkedHashMap<String, String> map = new LinkedHashMap<>(); map.put("/login.jsp", "anon"); map.put("/shiro/login", "anon"); map.put("/shiro/logout", "logout"); map.put("/user.jsp", "authc,roles[user]"); //表示必须经过认证才能访问并且有admin权限 map.put("/admin.jsp", "authc,roles[admin]"); //表示必须不经过认证(也就是记住我的情况下可以访问,关闭浏览器再开启也能访问) 也能访问并且有user权限 map.put("/list.jsp", "user"); map.put("/** ", "authc"); return map; } }
如果要自己做RememeberMe,需要在登录之前创建Token:UsernamePasswordToken(用户名,密码,是否记住我),且调用
UsernamePasswordToken 的 : token.setRememeberMe(true);
@RequestMapping("/login") public String login(@RequestParam("username") String username, @RequestParam("password") String password) { // 获取当前的 Subject. 调用 SecurityUtils.getSubject(); Subject currentUser = SecurityUtils.getSubject(); // let's login the current user so we can check against roles and permissions: // 测试当前的用户是否已经被认证. 即是否已经登录. // 调动 Subject 的 isAuthenticated() if (!currentUser.isAuthenticated()) { // 把用户名和密码封装为 UsernamePasswordToken 对象 UsernamePasswordToken token = new UsernamePasswordToken(username, password); // rememberme token.setRememberMe(true); try { System.out.println("1:"+token.hashCode()); // 执行登录. currentUser.login(token); } catch (AuthenticationException ae) { System.out.println("登录失败!"); } } return "redirect:/list.jsp"; }RememeberMe 实际上是由 rememeberMeManager进行配置的 ;rememeberMeManager是SecurityManager的一个属性,
所以可以在 applicationContext的 SecurityManager 中配置 rememeberMeManager:
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="cacheManager" ref="cacheManager"/> <!-- Single realm app. If you have multiple realms, use the 'realms' property instead. --> <!-- 配置session的管理方式 --> <!-- <property name="sessionMode" value="native"/> --> <!-- <property name="realm" ref="jdbcRealm"/> --> <!-- 配置多个Realm --> <property name="authenticator" ref="authenticator"></property> <property name="realms"> <list> <ref bean="jdbcRealm"/> <ref bean="secondRealm"/> </list> </property> <!-- 将cookie的作用时间配置为10s --> <property name="rememberMeManager.cookie.maxAge" value="10"></property> </bean>
可以看到 cookie的maxAge已被修改为 10s
当然 rememeberMeManager也可以单独配置:
