15. Shiro认证和记住我区别与实现

mac2025-10-18  7

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也可以单独配置:

 

最新回复(0)