背景:
上文中在落地实践时,对Shiro进行了相关的配置,并未对其含义作用进行详细学习,本章将进一步详解其作用含义。
Shiro配置类中的各个配置项的作用:
@Bean public SecurityManager securityManager() { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(myRealm()); securityManager.setSessionManager(defaultWebSessionManager()); securityManager.setCacheManager(ehCacheManager()); securityManager.setRememberMeManager(rememberMeManager()); return securityManager; } |
securityManager()
方法创建一个 DefaultWebSecurityManager
对象,并设置了相关的组件。DefaultWebSecurityManager
是 Shiro 的 SecurityManager
实现类,用于管理所有的 Subject(用户)。setRealm(myRealm())
设置了自定义的 Realm
对象,用于处理认证和授权逻辑。setSessionManager(defaultWebSessionManager())
设置了默认的 SessionManager
对象,用于管理用户的会话信息。setCacheManager(ehCacheManager())
设置了 EhCache 缓存管理器,用于缓存用户信息和权限信息。setRememberMeManager(rememberMeManager())
设置了 RememberMeManager,用于实现 "记住我" 功能。
public class MyShiroRealm extends AuthorizingRealm { @Resource private UserInfoService userInfoService; @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { UserInfo userInfo = (UserInfo) principalCollection.getPrimaryPrincipal(); SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo(); for (SysRole role : userInfo.getRoles()) { simpleAuthorizationInfo.addRole(role.getName()); for (SysPermission permission : role.getPermissions()) { simpleAuthorizationInfo.addStringPermission(permission.getName()); } } return simpleAuthorizationInfo; } @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { // 获取用户名 String username = (String) authenticationToken.getPrincipal(); // 根据username从数据库中查找 UserInfo 对象 UserInfo userInfo = userInfoService.findByUsername(username); if ( null == userInfo) { return null ; } SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo( userInfo, // 用户名 userInfo.getPassword(), // 密码 ByteSource.Util.bytes(userInfo.getSalt()), // salt=username+salt getName() // realm name ); return simpleAuthenticationInfo; } } |
MyShiroRealm 是一个自定义的 Realm 对象继承 AuthorizingRealm ,并实现其两个方法,在这两个方法中进行认证和授权相关逻辑的编写。以便 login 执行的调用。<br><br><br> |
1 2 3 4 5 6 7 | @Bean public DefaultWebSessionManager defaultWebSessionManager() { DefaultWebSessionManager sessionManager = new DefaultWebSessionManager(); sessionManager.setGlobalSessionTimeout( 1800000 ); sessionManager.setSessionIdCookie(sessionIdCookie()); return sessionManager; } |
defaultWebSessionManager()
方法创建一个 DefaultWebSessionManager
对象,用于管理用户的会话信息。setGlobalSessionTimeout(1800000)
设置全局会话超时时间为30分钟。setSessionIdCookie(sessionIdCookie())
设置会话 ID 的 Cookie。
1 2 3 4 5 6 7 | @Bean public SimpleCookie sessionIdCookie() { SimpleCookie cookie = new SimpleCookie( "sid" ); cookie.setHttpOnly( true ); cookie.setMaxAge(- 1 ); return cookie; } |
sessionIdCookie()
方法创建一个 SimpleCookie
对象,用于设置会话 ID 的 Cookie。setHttpOnly(true)
表示该 Cookie 只能通过 HTTP 协议获取,不能通过 JavaScript 等脚本语言获取,有助于防止跨站脚本攻击(XSS)。setMaxAge(-1)
表示该 Cookie 的有效期为浏览器会话结束时失效,即关闭浏览器后会话结束。
1 2 3 4 5 6 | @Bean public EhCacheManager ehCacheManager() { EhCacheManager cacheManager = new EhCacheManager(); cacheManager.setCacheManagerConfigFile( "classpath:ehcache.xml" ); return cacheManager; } |
ehCacheManager()
方法创建一个 EhCacheManager
对象,用于缓存 Shiro 的数据。setCacheManagerConfigFile("classpath:ehcache.xml")
指定 EhCache 的配置文件位置。
1 2 3 4 5 6 7 | @Bean public RememberMeManager rememberMeManager() { CookieRememberMeManager rememberMeManager = new CookieRememberMeManager(); rememberMeManager.setCookie(rememberMeCookie()); rememberMeManager.setCipherKey(Base64.decode( "4AvVhmFLUs0KTA3Kprsdag==" )); return rememberMeManager; } |
rememberMeManager()
方法创建一个 RememberMeManager
对象,用于实现 "记住我" 功能。setCookie(rememberMeCookie())
设置 RememberMe 的 Cookie。setCipherKey(Base64.decode("4AvVhmFLUs0KTA3Kprsdag=="))
设置加密密钥,用于加密 "记住我" 的信息。
1 2 3 4 5 6 7 | @Bean public SimpleCookie rememberMeCookie() { SimpleCookie cookie = new SimpleCookie( "rememberMe" ); cookie.setHttpOnly( true ); cookie.setMaxAge( 2592000 ); // 30 days return cookie; } |
rememberMeCookie()
方法创建一个 SimpleCookie
对象,用于设置 RememberMe 的 Cookie。setMaxAge(2592000)
设置 RememberMe 的 Cookie 有效期为 30 天。
小结:
通过对 Shiro 配置类中各个配置项的详细解释,可以更好地理解每个配置项的作用和含义,以及为什么要进行这些配置。这些配置项的设置可以根据具体的需求进行调整,以满足应用程序的安全性和功能性要求
总结:
感谢每一个认真阅读我文章的人!!!
作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。
-
文档获取方式:
-
加入我的软件测试交流群:680748947免费获取~(同行大佬一起学术交流,每晚都有大佬直播分享技术知识点)
这份文档,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!
以上均可以分享,只需要你搜索vx公众号:程序员雨果,即可免费领取