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

 

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

  1. 文档获取方式:

  2. 加入我的软件测试交流群:680748947免费获取~(同行大佬一起学术交流,每晚都有大佬直播分享技术知识点)

这份文档,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

以上均可以分享,只需要你搜索vx公众号:程序员雨果,即可免费领取

  • 19
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值