
我们可以看到这个框架图,我们的整个交互都是与security Manager做交互,而这里面就有一个Session Manager的管理器,Shiro当然内置了实现,我们也可以根据接口拓展其功能,那么下面,我们就来了解一下shiro中关于Session管理的部分内容
这是一个管理器实现类,是shiro提供的可用的结构。
上面两个图是该SessionManager的方法,当然,这些方法并不是全部,因为这个默认的管理器其实继承于其他的一些结构,下面是整个sessionManager的UML图
有关这部分的源码分析,我会在下次有精力的时候用一篇文章更新
获取当前subject的主机地址,该地址是通过HostAuthenticationTokengetHost()提供的。
获取/设置当前Session的过期时间;如果不设置是默认的会话管理器的全局过期时间。
获取会话的启动时间和最后访问时间;如果是JavaSE应用需要自己定期调用sessiontouch()去更新最后访问时间;如果是web应用,每次进入ShiroFilter都会自动调用sessiontouch()来更新最后访问时间。
更新会话最后访问时间及销毁会话;当Subjectlogout()时会自动调用stop方法来销毁会话的。如果在web中,调用javaxservlet>
从来没接触过shiro Java安全框架,突然有一天需要要用用户登陆验证和用户角色权限的任务,而且是针对shiro 进行整合,开始收到任务,心都有点凉凉的。经过一轮的搜索,感觉没多大的收获。很多用户的角色都是写在xml配置文件中。觉得太不人性化了,想换个用户角色还得改xml我觉得这么强大的框架应该不可能这么狗血的存在。然后认真的看文档,发现真的是可以直接读取数据库的。我把我搭建的流程发布在此。有问题的可以交流交流。我写的也并不是正确的,只能参考参考。
1webxml的配置
<listener>
<listener-class>orgapacheshirowebenvEnvironmentLoaderListener</listener-class>
</listener>
<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>orgapacheshirowebservletShiroFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/</url-pattern>
</filter-mapping>
2shiroini配置
[main]
[filters]
#自定义realm
shiroAuthorizingRealm = comframesecurityShiroAuthorizingRealm
securityManagerrealm = $shiroAuthorizingRealm
# 声明一个自定义的用户校验拦截器
customFormAuthenticationFilter = comframesecurityCustomFormAuthenticationFilter
# 声明一个自定义的用户角色权限拦截器
customPermissionsAuthorizationFilter = comframesecurityCustomPermissionsAuthorizationFilter
#cache
shiroCacheManager = orgapacheshirocacheehcacheEhCacheManager
shiroCacheManagercacheManagerConfigFile = classpath:ehcachexml
securityManagercacheManager = $shiroCacheManager
#session
sessionDAO = orgapacheshirosessionmgteisEnterpriseCacheSessionDAO
sessionManager = orgapacheshirowebsessionmgtDefaultWebSessionManager
sessionManagersessionDAO = $sessionDAO
securityManagersessionManager = $sessionManager
securityManagersessionManagerglobalSessionTimeout = 1800000
securityManager = orgapacheshirowebmgtDefaultWebSecurityManager
[urls]
/admin/user/login = anon
/admin/user/logout = anon
/admin/user/registered = anon
/admin/ = customFormAuthenticationFilter,customPermissionsAuthorizationFilter
从shiroini配置中可以看出,需要三个文件,分别为ShiroAuthorizingRealmjava(realm文件),CustomFormAuthenticationFilterjava(自定义用户登陆验证文件),CustomPermissionsAuthorizationFilter(自定义用户角色权限文件);
在urls配置中可以看出不需要拦截的url后面加上anon便可,但有先后顺序。
缓存是使用ehcache
3ehcachexml配置
<cache name="defaultCache" maxElementsInMemory="500"
maxElementsOnDisk="10000000" eternal="true" overflowToDisk="true"
diskSpoolBufferSizeMB="50" />
<cache name="shiro-activeSessionCache" maxElementsInMemory="500"
maxElementsOnDisk="10000000" eternal="true" overflowToDisk="true"
diskSpoolBufferSizeMB="50" />
<cache name="jdbcRealmauthorizationCache" maxElementsInMemory="500"
maxElementsOnDisk="10000000" eternal="true" overflowToDisk="true"
diskSpoolBufferSizeMB="50" />
<cache name="authorization" maxElementsInMemory="500"
timeToLiveSeconds="3600" eternal="false" overflowToDisk="false" />
4ShiroAuthorizingRealmjava
public class ShiroAuthorizingRealm extends AuthorizingRealm {
private AuthorityService authorityService = FrameContextgetBean(AuthorityServiceclass);
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
Systemoutprintln("=======doGetAuthenticationInfo=======");
UsernamePasswordToken userToken = (UsernamePasswordToken) token;
String username = userTokengetUsername();
String password = StringvalueOf(userTokengetPassword());
User user = UserdaofindFirst("select from m_user where account = ", username);
if (user != null) {//下面可以做一些登陆的 *** 作,密码错误,用户状态等等
if(MD5EncodervalidPassword(password, usergetPassword())==false){
throw new UnknownAccountException();
}
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user, password, getName());
return info;
} else {
return null;
}
}
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
Systemoutprintln("=======doGetAuthorizationInfo=======");
User user = (User) principalsgetPrimaryPrincipal();
if(user!=null){//从数据库中读取用户的角色权限,
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
List<String> perms = authorityServicegetUrlByUser(user);
if(perms!=null&&permssize()>0){//调用addStringPermissions方法把用户的权限信息添加到info中,可以addRoles方法把用户的角色添加到了info中
infoaddStringPermissions(perms);
}
return info;
}
return null;
}
}
5CustomFormAuthenticationFilterjava
public class CustomFormAuthenticationFilter extends FormAuthenticationFilter {
private final static Logger log = LoggergetLogger(CustomFormAuthenticationFilterclass);
private static final String contentType = "application/json; charset=UTF-8";
protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
>
我是在帐号验证成功后在doGetAuthenticationInfo里面显式调用doGetAuthorizationInfo(SecurityUtilsgetSubject()getPrincipals());即可获取当前所有的权限能达到和你一样的目的,但是不晓得是不是符合规范。因为我直接使用注解
controller中进行参数合法性检验后,由service执行subject的login方法,若未发生异常,则登陆成功,再此直接通过 subjectgetPrincipal(); ,将其存入 subjectgetSession(); 即可
thymeleaf中使用session可以正常获取
以上就是关于Shiro Session管理—— *** 作session全部的内容,包括:Shiro Session管理—— *** 作session、shiro登录时ehcache缓存报错、如何正确的使用shiro等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)