在 apache shiro 上为主题添加信息

Posted

技术标签:

【中文标题】在 apache shiro 上为主题添加信息【英文标题】:Add information to the subject on apache shiro 【发布时间】:2014-10-20 06:24:32 【问题描述】:

我正在使用 apache shiro。当我想知道用户是否有权限和角色时,我使用 SecutilyUtils.getSubject()。我想知道如何向主题添加更多信息,例如电子邮件、主键和我需要的任何其他业务信息,以便在必要时检索这些信息。

这是我的 shiro.ini:

[main]
ds = org.apache.shiro.jndi.JndiObjectFactory   
ds.requiredType = javax.sql.DataSource  
ds.resourceName = java:/comp/env/jdbc/myDS

# JDBC realm config  
jdbcRealm = com.mycompany.JdbcRealmImpl
jdbcRealm.permissionsLookupEnabled = true 
jdbcRealm.authenticationQuery = SELECT password FROM user WHERE username = ? AND status = 1
jdbcRealm.dataSource = $ds

sha256Matcher = org.apache.shiro.authc.credential.Sha256CredentialsMatcher
jdbcRealm.credentialsMatcher = $sha256Matcher

[urls]
/logout = logout
/** = authcBasic

这是我的 JdbcRealm

public class JdbcRealmImpl extends JdbcRealm 

    public JdbcRealmImpl() 
        super();
    

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(
            final AuthenticationToken token) throws AuthenticationException 

        final AuthenticationInfo info = super.doGetAuthenticationInfo(token);    

        // create a user to test
        final User user = new User();
        user.setId(11111);

        return new SimpleAuthenticationInfo(user, info.getCredentials(),
                getName());
    


这是我尝试检索用户信息的代码。

    final Subject currentUser = SecurityUtils.getSubject();
    final User user = (User) currentUser.getPrincipal();
    // null
    System.out.println(user); 

【问题讨论】:

看起来用户没有经过身份验证。这段代码中 SecurityUtils.getSubject().isAuthenticated() 的结果是什么? 结果为“真”。 不知何故正在工作,我认为它是邮递员中的一个缓存,它没有执行 doGetAuthenticationInfo。 Tnk 寻求帮助。 【参考方案1】:

您应该将其放入数据库并使用主题用户名(例如电子邮件地址)检索它。

【讨论】:

我尝试使用this aproach,但是当我尝试检索主体时它为空。 分享你正在使用的代码和配置,如果你想分析它 @Wouter 根据您的回答,这是否意味着 Shiro 不支持公开附加到主题的信息?登录后从数据库加载更多信息意味着每次都会执行两次对数据库的访问。 @MickaelMarrache 如果您想多次检索主题的数据而不访问数据库,您可以将其存储在用户 Session 对象中。 shiro.apache.org/session-management.html @Wouter 用户信息由一个或多个Realm加载。我想要非安全相关信息以及安全信息(例如密码)。在这个阶段(即在 Realm 中),无法访问会话(至少不能使用 AuthorizingRealm 接口定义的方法)。因此,我终于找到了解决方案。主要类型是对象。我猜 Shiro 希望我们使用我们的特定类。我测试过,它有效。只需将您的自定义用户实例作为主体传递给返回的 AuthenticationInfo 实例。

以上是关于在 apache shiro 上为主题添加信息的主要内容,如果未能解决你的问题,请参考以下文章

apache shiro:在 shiro.ini 中添加啥以使用 JWT 和 keycloak 作为授权服务器进行客户端身份验证

添加自定义过滤器 Apache Shiro + Spring Boot

如何使用带有 LDAP 身份验证的 Apache Shiro 添加角色授权

org.apache.shiro.crypto.CryptoException: Unable to execute ‘doFinal‘ with cipher instance

php 为主题添加页眉,页脚和部件支持(Themer)

Spring boot后台搭建二为Shiro权限控制添加Redis缓存