配置还有使用spring的方式,这里就不列出了,如果大家有兴趣,可以参考官方资料
至此,子系统已经接入CAS,当访问子系统的时候,如果没有经过认证,将会跳转到CAS服务器,登录后会自动返回到子系统,当然,这样做并没有实现单点登陆,因为子系统还没有设为登录状态.
CAS服务端在认证通过后,会把当前认证通过的登陆用户名传递到子系统,当然,认证通过的用户名有可能与子系统的用户名不一样,那子系统就需要一个认证通过的用户名与子系统用户的映射,在子系统拿到通过认证的用户名,再找到对应的子系统用户,然后把该用户设为登陆状态,这样才真正实现了单点登陆.
2.x版本client获取CAS传递过来的用户名的方法:
CAS 在登录成功过后,会给浏览器回传 Cookie,设置新的到的 Service Ticket。但客户端应用拥有各自的 Session,我们要怎么在各个应用中获取当前登录用户的用户名呢?CAS Client 的 Filter 已经做好了处理,在登录成功后,就可以直接从 Session的属性中获取
在 Java 中通过 Session 获取登录用户名
// 以下两者都可以 session.getAttribute(CASFilter.CAS_FILTER_USER); session.getAttribute("edu.yale.its.tp.cas.client.filter.user"); |
通过 JSTL 获取登录用户名
<c:out value="${sessionScope[CAS:'edu.yale.its.tp.cas.client.filter.user']}"/> |
通过 CASFilterRequestWrapper 获取登录用户名
CASFilterRequestWrapper reqWrapper=new CASFilterRequestWrapper(request); out.println("The logon user:" + reqWrapper.getRemoteUser()); |
3.1.3版本client获取CAS传递过来的用户名的方法
客户端获取登录用户名和用户信息实例
HttpServletRequest request = ServletActionContext.getRequest(); AttributePrincipal principal = (AttributePrincipal)request.getUserPrincipal(); String username = principal.getName(); Long orgnId = Long.parseLong(principal.getAttributes().get("orgnId").toString()); |