5

我正在阅读Apache Shiro,想看看我的思维模型是否正确。

来自文档:“ARealm是一个组件,可以访问特定于应用程序的安全数据,例如usersrolespermissions”。.. “领域通常与数据源(例如关系数据库、LDAP 目录、文件系统或其他类似资源)具有一对一的关联。”

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

好吧,太好了,但这Realms与用户的概念有什么关系?

  • 每个都Realm应该是用户空间的分区吗?即:aUser可能只出现在 1Realm
  • 或者,这就是我所期望的,Realms可用于将身份验证和授权置于彼此之上,并且可以在相同的情况下工作User。但是在这种情况下,User托管在哪里?Realm我猜它应该在 a 外部的某个地方,但是在哪里?

也许我对此感到困惑,因为我认为是User一个单一的实体(例如:我只能有一个)。而是应该将其User视为UserAccount. 即:每个人都Realm管理自己的Useraccounts(在名为 的文档中User),但 aUser可能有多个UserAcounts. 那是对的吗?

假设以上是正确的:

  • 是否有任何逻辑可以让我查询所有UserAccounts给定用户?即:基本上将所有内容合并Useraccounts在一起以获得完整的视图User
  • User在这种情况下(1User可能有多个)的概念UserAccounts甚至存在于 Shiro 中吗?
4

1 回答 1

4

Realms您定义in 之间的关系authenticationStrategy。让我们看看这个例子。只有当他通过所有领域的认证时,用户才会被认证。您可以制作自己的 authenticationStrategy 实现,它说只需一次成功的身份验证就足够了。

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

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

shiro.ini

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
于 2013-10-04T08:34:22.430 回答