Jak używać oddzielnych dziedzin do uwierzytelniania i autoryzacji za pomocą Shiro i CAS?
Pracuję w aplikacji internetowej, w której wiele aplikacji uwierzytelnia się za pośrednictwem serwera SSO CAS. Howerver, każda aplikacja powinna zachować swoje odpowiednie role i role te są przechowywane w bazie danych specyficznej dla aplikacji. Więc muszę mieć 2 dziedziny, jedną dla CAS (dla authc) i drugą dla DB (dla authz).
To jest moja obecna konfiguracja shiro. Przekierowanie do CAS działa prawidłowo, ale zalogowany użytkownik (Subject) nie ma załadowanych ról / uprawnień (np. SecurityUtil.isPermitted () nie działa zgodnie z oczekiwaniami)
<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>
Sposób, w jaki rejestruję dziedziny za pomocą menedżera zabezpieczeń, powinien być poprawny. Nie mogę znaleźć dobrego przykładu konfiguracji.
Mam tutaj 2 pytania:
Co to jest poprawna konfiguracja / konfiguracja, aby osiągnąć powyższy scenariusz?Jaka jest najlepsza praktyka zarządzania użytkownikami i rolami w różnych / oddzielnych aplikacjach?