Shiro 1.2已开始支持Jasig CAS单点登录。 单点登录主要用于多系统集成。 这意味着在多个系统中,用户只需登录一台中央服务器就可以访问其中的任何一个系统,而无需多次登录。
Jasig CAS单点登录系统分为服务器端和客户端,服务器端提供单点登录,多个客户端(子系统)跳转到该服务器进行登录验证。 大致流程如下。
1、访问需要客户端登录的页面http://localhost :9080/client /是否跳转到单点登录服务器3359 localhost 33608443/server/log in service=https://localhost :9443/client/cas;
原因:客户端访问任何地址都会被shirofilter阻止。 在shiro屏蔽后,您应该使用authc进行身份验证并发现用户没有登录,因此您将跳转到shirofilter配置的loginUrl页面
2、如果此时还没有登录到一次登入服务器,则会显示登录表单页面,通过输入用户名/密码登录;
4、客户端向服务器提交ticket以验证ticket是否有效如果有效服务器端返回用户id
解释:此时,访问/cas将被阻止在cas过滤器中,在cas过滤器中创建一个带有ticket的token,并调用subject.login方法。 此时继承并处理casRealm的myrealm。
默认的验证机制是前往服务器端进行ticket验证。
5、客户端可根据此用户身份获取当前系统用户/角色/权限等信息。
服务器端
我们可以使用Jasig CAS服务器v4.0.0-RC3的版本在官方的github上下载。 https://github.com/ja SIG/cas/tree/v4.0.0- rc3下载,其cas-server-windows
1、数字证书使用与《第十四章SSL》相同的数字证书,将localhost.keystore复制到shiro-example-chapter15-server模块根目录下;
2、将Jetty Maven插件添加到pom.xml中,并添加SSL支持:
Java代码
org.mortbay.jetty
jetty-maven-plugin
8.1.8.v20121106
/${project.build.finalName}
8080
8443
$ { project.basedir }/localhost.keystore
123456
123456
3、修改src/main/web app/we B-INF/deployerconfigcontext.XML,找到primaryAuthenticationHandler,添加账户:
Java代码
它还支持JDBC查询等,可以自行定制。 具体请参考文档。
4、mvn jetty:run开始服务器测试即可。
访问https://localhost :8443/chapter 15-server/log in时,将显示以下登录页:
输入用户名/密码(如张/123 )后,将显示登录成功页面。
此服务器端的简单配置已完成。
客户端
1、首先使用localhost.keystore将数字证书(公钥)导出到d:(localhost.cer )
Java代码
keytool-export-alias localhost-filed :localhost.cer-key stored 3360 localhost.keystore
2 .由于CAS客户端必须使用此证书进行验证,因此必须将证书导入到JDK中。
Java代码
cdd :JDK1.7.0_ 21JRElibsecurity
ey tool-import-alias localhost-filed : (localhost.cer-no prompt-trust cacerts-storetype jks-keystore cacerts-SSS )
如果导入失败,请删除安全目录下的cacerts;
3、按照服务器端Jetty Maven插件的配置方式配置Jetty插件
4、在shiro-example-chapter15-client模块中引入shiro-cas依赖项。 具体请参照其pom.xml;
5、定制CasRealm :
p>Java代码
public class MyCasRealm extends CasRealm {
private UserService userService;
public void setUserService(UserService userService) {
this.userService = userService;
}
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
String username = (String)principals.getPrimaryPrincipal();
SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
authorizationInfo.setRoles(userService.findRoles(username));
authorizationInfo.setStringPermissions(userService.findPermissions(username));
return authorizationInfo;
}
}
CasRealm根据CAS服务器端返回的用户身份获取相应的角色/权限信息。
6、spring-shiro-web.xml配置:
Java代码
……
casServerUrlPrefix:是CAS Server服务器端地址;
casService:是当前应用CAS服务URL,即用于接收并处理登录成功后的Ticket的;
如果角色/权限信息是由服务器端提供的话,我们可以直接使用CasRealm:
Java代码
……
defaultRoles/ defaultPermissions:默认添加给所有CAS登录成功用户的角色和权限信息;
roleAttributeNames/ permissionAttributeNames:角色属性/权限属性名称,如果用户的角色/权限信息是从服务器端返回的(即返回的CAS Principal中除了Principal之外还有如一些Attributes),此时可以使用roleAttributeNames/ permissionAttributeNames得到Attributes中的角色/权限数据;请自行查询CAS获取用户更多信息。
Java代码
CasFilter类似于FormAuthenticationFilter,只不过其验证服务器端返回的CAS Service Ticket。
Java代码
/casFailure.jsp = anon
/cas = cas
/logout = logout
/** = user
loginUrl:https://localhost:8443/chapter15-server/login表示服务端端登录地址,登录成功后跳转到?service参数对于的地址进行客户端验证及登录;
“/cas=cas”:即/cas地址是服务器端回调地址,使用CasFilter获取Ticket进行登录。
7、测试,输入http://localhost:9080/chapter15-client地址进行测试即可,可以使用如Chrome开这debug观察网络请求的变化。
如果遇到以下异常,一般是证书导入错误造成的,请尝试重新导入,如果还是不行,有可能是运行应用的JDK和安装数字证书的JDK不是同一个造成的:
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:385)
at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292)
at sun.security.validator.Validator.validate(Validator.java:260)
at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:326)
at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:231)
at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:126)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1323)
... 67 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:196)
at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:268)
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:380)
... 73 more