Как соотносятся понятия User (UserAccount) и Realm в Apache Shiro?
Я читаю об Apache Shiro и хотел бы узнать, правильно ли я понял эту ментальную модель.
Из документов: "А
Realm
является компонентом, который может получить доступ к данным безопасности приложения, таким какusers
,roles
, а такжеpermissions
". .. " Области обычно имеют соотношение 1 к 1 с источником данных, таким как реляционная база данных, каталог LDAP, файловая система или другой подобный ресурс. "
Более того, я читал, что application
может включать в себя несколько realms
для целей аутентификации и авторизации.
Хорошо, так здорово, но как это сделать Realms
относятся к концепции пользователя?
- каждый
Realm
ожидается разделение на пользовательское пространство? То есть:User
может произойти только в 1Realm
- или, и это то, что я ожидаю,
Realms
может использоваться для наложения слоя аутентификации и авторизации друг на друга и может работать на том жеUser
, Однако в этом случае, где находитсяUser
удалось? Это должно быть где-то внеRealm
Я думаю, но где?
Возможно, я смущен этим, потому что я думаю о User
как единое целое (например, из меня может быть только один) . И должен вместо этого думать о User
как UserAccount
, Т.е. каждый Realm
управляет своим собственным Useraccounts
(в документах называется User
), но User
может иметь несколько UserAcounts
, Это верно?
Предполагая, что вышеупомянутое правильно:
- есть ли логика, которая позволяет мне запрашивать все
UserAccounts
данного пользователя? Т.е.: в основном объединяет всеUseraccounts
вместе, чтобы получить полное представление оUser
? - делает понятие
User
в этом случае (1User
возможно, иметь несколькоUserAccounts
) вообще есть в сиро?
1 ответ
Вы определяете связь между Realms
в 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