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

这篇具有很好参考价值的文章主要介绍了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 配置类中各个配置项的详细解释,可以更好地理解每个配置项的作用和含义,以及为什么要进行这些配置。这些配置项的设置可以根据具体的需求进行调整,以满足应用程序的安全性和功能性要求文章来源地址https://www.toymoban.com/news/detail-651635.html

到了这里,关于Shiro配置类中的各个配置项浅谈的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ts 类中的修饰符

    修饰符:类中的 成员的修饰符 ,主要是描述类中的成员( 属性 , 构造方法 , 方法 )的 可访问性 类中的成员都有自己的 默认修饰符 public 修饰符有哪几种? public : 公共的 ,任何位置都可以访问 private : 私有的 ,只有 自身内部可以访问 ,外部、子类中都无法访问该成

    2024年02月08日
    浏览(31)
  • C++ | 说说类中的static成员

    【概念】:声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为 静态成员变量 ;用static修饰的成员函数,称之为 静态成员函数 。静态成员变量一定要在类外进行初始化 💬 面试题:实现一个类,计算程序中创建出了多少个类对象 上面这个是曾经一家公

    2023年04月24日
    浏览(35)
  • Python类中的self参数的理解

    对于self参数来说,和一般初学者一样,只把它作为类里面函数参数的第一个必须要写的内容,感觉和C++ 类里面的this 指针类似,具体没有深究。现在有时间把这点再仔细理解下。 首先需要明确以下几点: self 只用在 类 的方法中,单独的函数不需要。 self 在 定义类 的方法时

    2024年02月14日
    浏览(35)
  • C# File类中的文件读写方法

    C# 提供了多种操作文件的方案, File 类中封装的静态方法,接口封装得比较人性化,隐藏了具体实现的细节,主要包括读取、写入以及追加,这些函数如下 类别 字节读写 字符串列表 字符串 读取 ReadAllBytes ReadAllLines ReadAllText ReadLines 写入 WriteAllBytes WriteAllLines WriteAllText 追加

    2024年02月06日
    浏览(40)
  • Python趣味入门13:类中的各种变量

    其中我们已知道定义变量在类中就表示为属性。但是在不同的位置定义变量会有不同的作用,并且采用不同的命名方式,也会让变量具有不同的作用 本文假设有一个类指南针(compass),可想象成某个地图游戏中帮助主角寻找方向,也是本节主要的示例。 compass类的定义如下代

    2024年02月04日
    浏览(41)
  • String类中的一些常用方法(JAVA)

    目录 字符串比较方法: boolean equals(Object anObject):  int compareTo(String s): int compareToIgnoreCase(String str) 字符串查找方法: char charAt(int index): int indexOf(int ch):  int indexOf(int ch, int fromIndex): int indexOf(String str): int indexOf(String str, int fromIndex): int lastIndexOf(int ch): int lastIndexOf(in

    2024年02月07日
    浏览(40)
  • SpringBoot根据注解动态执行类中的方法

    有一个接口提供了xx的服务,有两个场景分别实现了xx的具体逻辑,标记为xx1和xx2。 然后场景一过来的时候执行xx1逻辑,场景二过来的时候执行xx2逻辑。 定义一个service层,提供xx的接口。 然后定义两个serviceImpl,@Service(name=\\\"\\\")标记不同的名称,分别提供xx的具体实现。 在使用

    2024年02月14日
    浏览(44)
  • 如何在 PHP 中动态调用类中的方法?

    在PHP中,我们可以通过动态调用类方法的方式来实现更加灵活的编程。这种方法可以使我们在运行时根据具体的需要来动态调用类中的方法。 1.使用call_user_func函数 PHP中提供了 call_user_func 函数用于动态调用类方法。 其中, $object 为类的实例化对象, $methodName 为要调用的方法

    2024年01月19日
    浏览(47)
  • C++回调函数 匿名函数,类中的方法做为回调函数

    C++中的回调函数和匿名函数都是函数指针或函数对象的使用形式。下面分别介绍它们的使用方法。 回调函数是一种函数指针,它允许将函数作为参数传递给另一个函数,并在需要时调用它。这种技术通常用于事件处理、异步处理和状态机等应用中。 下面是一个简单的示例,

    2024年02月01日
    浏览(45)
  • C++day3(类、this指针、类中的特殊成员函数)

    1.类的应用实例 2.定义一个矩形类(Rectangle),包含私有成员长(length)、宽(width),定义成员函数: 设置长度: void set_len(int l); 设置宽度: void set_wid(int w); 获取长度: int get_len(); 获取宽度: int get_wid(); 显示周长和面积: void show(); 3.必须使用this指针的场合 4.构造函数允许函数重载 5.构造

    2024年02月11日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包