由于内部系统越来越多,单点登录已经是一个较优选择。之前各个系统都集成了shiro作为权限管理,
所以必须要把shiro与cas集成。
集成步骤:
首先在POM中引入shiro-cas包
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-cas</artifactId>
<version>1.2.2</version>
</dependency>
添加一个MyCasRealm继承CasRealm,在其中重写doGetAuthorizationInfo方法,用于设置权限
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
String username = (String)principals.getPrimaryPrincipal();
SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
authorizationInfo.setRoles(roles);
authorizationInfo.setStringPermissions(permission);
return authorizationInfo;
}
在springShiro.xml(系统内部shiro配置文件)中添加
<bean id="casRealm" class="com.shijie99.order.common.shiro.MyCasRealm">
<property name="cachingEnabled" value="true"/>
<property name="authenticationCachingEnabled" value="true"/>
<property name="authenticationCacheName" value="authenticationCache"/>
<property name="authorizationCachingEnabled" value="true"/>
<property name="authorizationCacheName" value="authorizationCache"/>
<property name="casServerUrlPrefix" value="http://127.0.0.1:8080/cas"/>
<property name="casService" value="http://127.0.0.1:8580/innersystem/cas"/>
</bean>
<bean id="casFilter" class="org.apache.shiro.cas.CasFilter">
<property name="failureUrl" value="/unauthorized"/>
</bean>
在shiroFilter中添加
<property name="loginUrl" value="http://127.0.0.1:8080/cas?service=http://127.0.0.1:8580/innersystem/cas"/>
在filters中添加
<entry key="cas" value-ref="casFilter"/>
在其filterChainDefinitions中添加
/cas = cas
即
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager"/>
<property name="loginUrl" value="http://127.0.0.1:8080/cas?service=http://127.0.0.1:8580/innersystem/cas"/>
<property name="filters">
<util:map>
<!-- <entry key="authc" value-ref="formAuthenticationFilter"/> -->
<entry key="sysUser" value-ref="sysUserFilter"/>
<entry key="cas" value-ref="casFilter"/>
</util:map>
</property>
<property name="filterChainDefinitions">
<value>
/unauthorized = anon
/cas = cas
/logout = logout
/resources/** = anon
/** = user
</value>
</property>
</bean>
需要注意的是,之前在casRealm中存在
<property name="credentialsMatcher" ref="credentialsMatcher"/>
这个配置,集成后一直报重定向循环。
由于credentialsMatcher是继承了HashedCredentialsMatcher,这个方法认证ticket是用
char[]类型的,导致类型转换失败。而之前没有配置失败URL,所以一直重定向。