Я работаю над веб-приложением, где несколько приложений аутентифицируются через сервер SSO CAS. Howerver, каждое приложение должно поддерживать свои соответствующие роли, и эти роли хранятся в базе данных, специфичной для приложения. Итак, мне нужно иметь 2 сферы, один для CAS (для authc) и другой для DB (для authz).Как использовать отдельные сферы для аутентификации и авторизации с Shiro и CAS?
Это мой текущий конфигуратор shiro. Я получаю перенаправление к CAS, работающему должным образом, но зарегистрированный пользователь (Subject), похоже, не загружает роли/разрешения (например, SecurityUtil.isPermited() не работает должным образом)
<bean id="jdbcRealm" class="org.apache.shiro.realm.jdbc.JdbcRealm">
<property name="name" value="jdbcRealm" />
<property name="dataSource" ref="dataSource" />
<property name="authenticationQuery"
value="SELECT password FROM system_user_accounts WHERE username=? and status=10" />
<property name="userRolesQuery"
value="SELECT role_code FROM system_roles r, system_user_accounts u, system_user_roles ur WHERE u.user_id=ur.user_id AND r.role_id=ur.role_id AND u.username=?" />
<property name="permissionsQuery"
value="SELECT code FROM system_roles r, system_permissions p, system_role_permission rp WHERE r.role_id=rp.role_id AND p.permission_id=rp.permission_id AND r.role_code=?" />
<property name="permissionsLookupEnabled" value="true"></property>
<property name="cachingEnabled" value="true" />
<property name="credentialsMatcher" ref="passwordMatcher" />
</bean>
<!-- For CAS -->
<bean id="casRealm" class="org.apache.shiro.cas.CasRealm">
<property name="defaultRoles" value="ROLE_USER" />
<property name="casServerUrlPrefix" value="http://localhost:7080/auth" />
<property name="casService" value="http://localhost:8080/hawk-hck-web/shiro-cas" />
<property name="validationProtocol" value="SAML" />
<property name="cachingEnabled" value="true"></property>
</bean>
<bean id="casSubjectFactory" class="org.apache.shiro.cas.CasSubjectFactory" />
<!-- Security Manager -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realms">
<list>
<ref bean="casRealm" />
<ref bean="jdbcRealm" />
</list>
</property>
<property name="cacheManager" ref="cacheManager"/>
<property name="subjectFactory" ref="casSubjectFactory" />
</bean>
<bean id="casFilter" class="org.apache.shiro.cas.CasFilter">
<property name="failureUrl" value="/error"></property>
</bean>
<!-- Shiro filter -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager" />
<property name="loginUrl" value="http://localhost:7080/auth/login?service=http://localhost:8080/hawk-hck-web/shiro-cas" />
<property name="successUrl" value="/home/index" />
<property name="unauthorizedUrl" value="/error" />
<property name="filters">
<util:map>
<entry key="casFilter" value-ref="casFilter" />
</util:map>
</property>
<property name="filterChainDefinitions">
<value>
<!-- !!! Order matters !!! -->
/shiro-cas = casFilter
/login = anon
/logout = logout
/error = anon
/static/** = anon
/** = authc
</value>
</property>
</bean>
Способ регистрации областей с помощью SecurityManager должен быть правильным. Я не могу найти хороший пример установки.
У меня есть 2 вопроса здесь:
- Что правильно настроить/конфигурации для достижения упомянутого выше сценария?
- Какова наилучшая практика управления пользователями и ролями в разных/отдельных приложениях?
Вы проверили роли? Мы используем очень похожую конфигурацию с casRealm для аутентификации и textRealm и/или activeDirectoryRealm для авторизации. Для разрешений мы используем пользовательскую реализацию RolePermissionResolver. –
В casRealm мы опускаем свойство defaultRoles. –