Как соотносятся понятия User (UserAccount) и Realm в Apache Shiro?

Я читаю об Apache Shiro и хотел бы узнать, правильно ли я понял эту ментальную модель.

Из документов: "А Realm является компонентом, который может получить доступ к данным безопасности приложения, таким как users, roles, а также permissions". .. " Области обычно имеют соотношение 1 к 1 с источником данных, таким как реляционная база данных, каталог LDAP, файловая система или другой подобный ресурс. "

Более того, я читал, что application может включать в себя несколько realms для целей аутентификации и авторизации.

Хорошо, так здорово, но как это сделать Realms относятся к концепции пользователя?

  • каждый Realm ожидается разделение на пользовательское пространство? То есть: User может произойти только в 1 Realm
  • или, и это то, что я ожидаю, Realms может использоваться для наложения слоя аутентификации и авторизации друг на друга и может работать на том же User, Однако в этом случае, где находится User удалось? Это должно быть где-то вне Realm Я думаю, но где?

Возможно, я смущен этим, потому что я думаю о User как единое целое (например, из меня может быть только один) . И должен вместо этого думать о User как UserAccount, Т.е. каждый Realm управляет своим собственным Useraccounts (в документах называется User), но User может иметь несколько UserAcounts, Это верно?

Предполагая, что вышеупомянутое правильно:

  • есть ли логика, которая позволяет мне запрашивать все UserAccounts данного пользователя? Т.е.: в основном объединяет все Useraccounts вместе, чтобы получить полное представление о User?
  • делает понятие User в этом случае (1 User возможно, иметь несколько 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
Другие вопросы по тегам