首页 > 编程知识 正文

shiro集成单点登录,shiro执行流程

时间:2023-05-05 06:35:49 阅读:149132 作者:1103

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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。