首页 > 其他分享 >Shiro配置类中的各个配置项浅谈

Shiro配置类中的各个配置项浅谈

时间:2023-08-16 23:34:32浏览次数:55  
标签:cookie return 浅谈 rememberMeManager securityManager SimpleCookie 类中 new Shiro

背景:

上文中在落地实践时,对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 执行的调用。


@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。

 

@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 的有效期为浏览器会话结束时失效,即关闭浏览器后会话结束。

 

@Bean
public EhCacheManager ehCacheManager() {
    EhCacheManager cacheManager = new EhCacheManager();
    cacheManager.setCacheManagerConfigFile("classpath:ehcache.xml");
    return cacheManager;
}
  • ehCacheManager() 方法创建一个 EhCacheManager 对象,用于缓存 Shiro 的数据。
  • setCacheManagerConfigFile("classpath:ehcache.xml") 指定 EhCache 的配置文件位置。

 

@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==")) 设置加密密钥,用于加密 "记住我" 的信息。

 

@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 配置类中各个配置项的详细解释,可以更好地理解每个配置项的作用和含义,以及为什么要进行这些配置。这些配置项的设置可以根据具体的需求进行调整,以满足应用程序的安全性和功能性要求

标签:cookie,return,浅谈,rememberMeManager,securityManager,SimpleCookie,类中,new,Shiro
From: https://www.cnblogs.com/beyond-tester/p/17636491.html

相关文章

  • 详谈 springboot整合shiro
    背景:上文学习了shrio基本概念后,本章将进一步的落地实践学习,在springboot中如何去整合shrio,整个过程步骤有个清晰的了解。 利用Shiro进行登录认证主要步骤:1.添加依赖:首先,在pom.xml文件中添加SpringBoot和Shiro的相关依赖。<!--SpringBoot--><dependency><groupI......
  • 浅谈工业企业能耗管理系统的智慧化构建
    摘要:能源是人类社会发展的重要推动力,能源缺乏,将导致人类无法正常开展生产生活活动。如果失去能源的支持,现代社会的运作将会直接瘫痪或崩溃。所以,为了解决目前日益严峻的能源问题,应采用高*率的节能监测技术来促*能源的合理利用,从而达到节能减排的目的。文章对智慧化工业企业能耗监测......
  • 浅谈拦截器和过滤器
    在Java中,拦截器(Interceptor)是一种用于拦截和处理请求的组件。它可以在请求被处理前和处理后对请求进行拦截和修改。拦截器通常用于实现一些公共的功能,比如日志记录、权限验证、性能监控等。下面是一个简单的Java拦截器示例代码:1publicclassLoggingInterceptorimplements......
  • 浅谈自己理解的JWT
    1、什么是JWTJWT是由三部分组成,包括头部(Header)、有效载荷(ayload)、签名(Signature)1.1头部是配置信息一般由两部分组成(I.令牌的类型,II.使用的签名算法)1.2有效载荷部分首先包含一些非敏感的数据,其次要包含过期时间(设置有效期)1.3签名部分,是对前两部分......
  • 浅谈智能电力系统的应用及运维研究
    未晓妃安科瑞断电气股份有限公司上海嘉定201801摘要:受到市场经济的影响,相应地增加电力的需求,无疑提高对电力行业运行的要求。为此,本文对于电力监控系统的应用从预警及故障检测、遥控及遥调操作两个方面探究。此外,对于电力监控系统的运行,可从系统运行布局、系统监控失控后事故处理......
  • shiro用户登录验证
    @ApiOperation(value="用户登录",notes="用户登录",httpMethod="POST")@PostMapping({"/login"})publicResultVOlogin(@ApiParam(name="username",value="用户名",required=true)@RequestPar......
  • 浅谈电力智能系统在电力生产中的应用
    未晓妃安科瑞断电气股份有限公司上海嘉定201801摘要:电力监控系统是现代电力科技事业发展的标志,其在供配电设计中具有重要作用。供配电中的电力监控能提升用电明确性,提高电网工作效率,进而有*降低电力系统运营成本。本文通过对供配电设计中电力监控系统进行*面分析,最后对电力监控系......
  • 浅谈 KVC
    简介KVC 是 KeyValueCoding 的简称,遵循 NSKeyValueCoding 协议,它是一种可以直接通过字符串的名字 key 来访问类属性的机制,而不是通过调用 setter、getter 方法访问。对于 KVC,Cocoa 自动放入和取出基本数据类型放入 NSNumber 或 NSValue 中,当使用 setValue:ForKey:......
  • 继承类中执行优先级
    继承类中执行优先级目录继承类中执行优先级1方法2参数1方法classBase():deffoo2(self):print('basefoo1')deffoo1(self):print('basefoo1')self.foo2()classFoo(Base):deffoo2(self):print('foofoo2......
  • 浅谈5G技术会给视频监控行业带来的一些变革情况
    5G是第五代移动通信技术,能够提供更高的带宽和更快的传输速度,这将为视频技术的发展带来大量机会。随着5G技术的逐步普及与商用,人们将能够享受到更加流畅的高清视频体验,并且5G技术还拥有更低的延迟和更高的网络容量。这些优势不仅将推动视频技术的变革,也将创造出更多的商业机会和产业......