今天写登录功能,想要实现记住我功能,然后到处找了一些,始终不够完整,于是我就自己研究了最终实现如下
1.在登录页面加入“记住我”复选框,如下
<input type="checkbox" name="rememberMe" value="true">记住我</input>
需要注意的是,这里的name,只能写为remeberMe,因为shiro内部集成了会自动获取这个字段的值,后面的value="true"
,这个是我自己加上去的,相当于是一个默认值,默认为记住我状态
2.后台Controller里面接收参数:
//获取当前登录主体
Subject subject = SecurityUtils.getSubject();
//如果当前用户还没有认证
try {
//如果当前主体未认证,就开始认证
if (!subject.isAuthenticated()) {
//将传入的用户名和密码封装到UsernamePasswordToken
subject.login(token);
Employee employee = (Employee) subject.getPrincipal();
//登录成功之后将当前用户对象放到session中去
SessionUtil.setUserSession(employee);
//记住我
token.setRememberMe(true);
}
return new AjaxResult();
需要注意的是,我做的是在这里登录成功之后,就直接就setRememberMe(true)
,当然,这里可以自己加判断,有if语句和三目都可以实现,基于你的需求不一样而已。
3.配置权限
我这里是自定义的map集合来动态获取数据库中的权限,以及添加新的权限请求,如果需要具体配置的方法介绍,可以留言
public class MyFilterChainDefinitionMap {
@Autowired
private IPermissionService permissionService;
/**
* 动态获取数据库中的权限
* @return
*/
public Map<String,String> createMap(){
//准备一个map集合
Map<String,String> map = new LinkedHashMap<>();
//通过注入的IPermissionService对象来查找出所有的Permission(权限对象)
List<Permission> permissionList = permissionService.findAll();
//循环遍历所有的Permission
for (Permission permission : permissionList) {
//在过程中,动态添加权限 --//url(=== /employee/save) 对应 sn(=== employee:save) //ArvinPermission是自定义的过滤器
map.put(permission.getUrl(),"ArvinPermission["+permission.getSn()+"]");
}
//直接放行登录请求
map.put("/login","anon");
//这里用于对所有的静态资源进行放行
map.put("/static/**","anon");
//注销请求
map.put("/logout","logout");
//拦截所有请求,需要认证才能通行
//map.put("/**","authc");
// --- /** = user 表示对访问所有地址对认证过的用户进行放行
map.put("/**","user");
return map;
}
}
在这个里面就是将原来的map.put("/**","authc");
替换为map.put("/**","user");
,相当于原来所有的请求都需要认证,而现在就是所有的请求对认证过的主体进行放行(不等于不需要权限访问所有链接)
4.shiro.xml配置
<bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
<!--设置cookie的名称-->
<constructor-arg value="rememberMe"/>
<property name="httpOnly" value="true"/>
<!--30*24*60*60 = 2592000(天*小时*分钟*秒钟) 设置cookie的存活时间 -->
<property name="maxAge" value="2592000"/><!-- 30 天 -->
</bean>
<!-- rememberMe 管理器 -->
<!--rememberMe 管理器,cipherKey 是加密 rememberMe Cookie 的密钥;默认 AES 算法-->
<bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager">
<property name="cipherKey" value=" #{T(org.apache.shiro.codec.Base64).decode('4AvVhmFLUs0KTA3Kprsdag==')}"/>
<property name="cookie" ref="rememberMeCookie"/>
</bean>
<!-- 会话ID生成器 -->
<bean id="sessionIdGenerator" class="org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator"/>
<!-- 会话Cookie模板,使用sid存储sessionid -->
<bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
<constructor-arg value="sid"/>
<property name="httpOnly" value="true"/>
<!--这里就是设置的一次会话管半个小时-->
<property name="maxAge" value="180000"/>
</bean>
<!-- 会话DAO -->
<bean id="sessionDAO" class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO">
<property name="activeSessionsCacheName" value\="shiro-activeSessionCache"/>
<property name="sessionIdGenerator" ref="sessionIdGenerator"/>
</bean>
<!-- 会话验证调度器 -->
<bean id="sessionValidationScheduler" class="org.apache.shiro.session.mgt.quartz.QuartzSessionValidationScheduler">
<property name="sessionValidationInterval" value="1800000"/>
<property name="sessionManager" ref="sessionManager"/>
</bean>
<!-- 会话管理器 -->
<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
<!--失效时间,单位为毫秒-->
<property name="globalSessionTimeout" value="1800000"/>
<!--<!–删除无效session–> -->
<property name="deleteInvalidSessions" value="true"/>
<property name="sessionValidationSchedulerEnabled" value="true"/>
<property name="sessionValidationScheduler" ref="sessionValidationScheduler"/>
<property name="sessionDAO" ref="sessionDAO"/>
<property name="sessionIdCookieEnabled" value="true"/>
<property name="sessionIdCookie" ref="sessionIdCookie"/>
</bean>
这里配置结束之后,需要再将sessionManager
和rememberMeManager
配置进shiro的核心对象securityManager
中
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="arvinRealm"/>
<property name="sessionManager" ref="sessionManager"/>
<!--引入记住我属性-->
<property name="rememberMeManager" ref="rememberMeManager"/>
</bean>
到这里,我们的记住我功能就全部实现