代码之家  ›  专栏  ›  技术社区  ›  Geert-Jan

在Apache Shiro中,用户(UserAccount)和领域的概念是如何关联的?

  •  5
  • Geert-Jan  · 技术社区  · 12 年前

    我正在阅读 Apache Shiro 想看看我的心理模型是否正确。

    来自 docs :“A Realm 是一个可以访问特定于应用程序的安全数据的组件,例如 users , roles permissions “…”领域通常与数据源(如关系数据库、LDAP目录、文件系统或其他类似资源)具有1对1的相关性。"

    此外,我读过 application 可能包括多个 realms 用于其身份验证和授权目的。

    好的,太好了,但是怎么做呢 Realms 与用户的概念相关?

    • 是每个 领域 应该是用户空间上的分区吗?I.e:一个 User 可能只出现在1中 领域
    • 或者,这就是我所期待的, 领域 可以用于分层认证&彼此之上的授权,以及 也许 做同样的事情 使用者 然而,在这种情况下 使用者 管理?它应该在 领域 我想,但在哪里?

    也许我对此感到困惑,因为我在想 使用者 作为一个单一的实体(例如:我只能有一个)。相反,应该考虑 使用者 作为一个 UserAccount 即:每个 领域 自己管理 Useraccounts (在名为 使用者 ),但是 使用者 可能有多个 UserAcounts 。对吗?

    假设以上内容正确:

    • 有什么逻辑可以让我查询所有 UserAccounts 给定用户的?I.e:基本上合并了所有 用户帐户 一起欣赏 使用者 ?
    • 的概念 使用者 在这种情况下(1 使用者 可能有多个 用户帐户 )甚至存在于四郎?
    1 回复  |  直到 10 年前
        1
  •  4
  •   Jens Piegsa    8 年前

    您定义了 Realms 在里面 authenticationStrategy 。让我们看看这个例子。只有当用户通过针对所有领域的身份验证时,才会对其进行身份验证。您可以制作自己的authenticationStrategy实现,该实现表示只要一次成功的身份验证就足够了。

    在本例中,我们结合JDBC领域来存储用户名(无密码),并根据LDAP对其进行身份验证。

    假设您将添加另一个LDAP领域并创建authenticationStrategy,其中不需要针对领域的所有身份验证。但是,只需要一次针对LDAP的成功身份验证就足够了。

    白衬衫

    ds = org.apache.shiro.jndi.JndiObjectFactory
    ds.requiredType = javax.sql.DataSource
    ds.resourceName = java:comp/env/jdbc/xxx
    
    noPassWordCredentialMatcher = eu.corp.domain.auth.NoPassMatcher
    
    ldapRealm = eu.corp.domain.auth.CustomActiveDirectoryRealm
    ldapRealm.searchBase = OU=USERS,OU=EN,DC=our,DC=corp
    ldapRealm.url = ldap://our.corp:389
    ldapRealm.principalSuffix = @our.corp
    
    jdbcRealm = org.apache.shiro.realm.jdbc.JdbcRealm
    jdbcRealm.permissionsLookupEnabled = true
    jdbcRealm.dataSource = $ds
    jdbcRealm.credentialsMatcher = $noPassWordCredentialMatcher
    
    jdbcRealm.authenticationQuery = SELECT name FROM auth WHERE name = ?
    jdbcRealm.userRolesQuery = SELECT role.shortcut FROM auth LEFT JOIN auth_role ON auth_role.auth_id = auth.id LEFT JOIN role ON role.id = auth_role.role_id WHERE auth.name = ?
    jdbcRealm.permissionsQuery = SELECT permission.shortcut FROM role JOIN role_permission ON role_permission.role_id = role.id JOIN permission ON permission.id = role_permission.permission_id WHERE role.shortcut = ?
    
    cacheManager = org.apache.shiro.cache.ehcache.EhCacheManager
    securityManager.cacheManager = $cacheManager
    
    securityManager.realms = $ldapRealm, $jdbcRealm
    authcStrategy = org.apache.shiro.authc.pam.AllSuccessfulStrategy
    securityManager.authenticator.authenticationStrategy = $authcStrategy