Shiro Session管理—— *** 作session

Shiro Session管理—— *** 作session,第1张

我们可以看到这个框架图,我们的整个交互都是与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等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/9636467.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存