首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

应用 CAS 在 Tomcat 中实现单点登录(部署客户端应用)

2012-12-24 
使用 CAS 在 Tomcat 中实现单点登录(部署客户端应用)?web-app...filterfilter-nameCAS Filter/filt

使用 CAS 在 Tomcat 中实现单点登录(部署客户端应用)

?

<web-app> ... <filter> <filter-name>CAS Filter</filter-name> <filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class> <init-param> <param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name> <param-value>https://domainA:8443/cas/login</param-value> </init-param> <init-param> <param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name> <param-value>https://domainA:8443/cas/serviceValidate</param-value> </init-param> <init-param> <param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name> <param-value>domainB:8080</param-value> </init-param> </filter> <filter-mapping> <filter-name>CAS Filter</filter-name> <url-pattern>/protected-pattern/*</url-pattern> </filter-mapping> ...</web-app>?

对于所有访问满足 casTest1/protected-pattern/ 路径的资源时,都要求到 CAS Server 登录,如果需要整个 casTest1 均受保护,可以将 url-pattern 指定为“/*”。

从清单 10 可以看到,我们可以为 CASFilter 指定一些参数,并且有些是必须的,表格 1?和表格 2?中分别是必需和可选的参数:


表格 1. CASFilter 必需的参数

session.getAttribute(CASFilter.CAS_FILTER_USER);session.getAttribute("edu.yale.its.tp.cas.client.filter.user");?

在 JSTL 中获取用户名的方法如清单 12 所示:


清单 12. 通过 JSTL 获取登录用户名

<c:out value="${sessionScope[CAS:'edu.yale.its.tp.cas.client.filter.user']}"/>
?

另外,CAS 提供了一个 CASFilterRequestWrapper 类,该类继承自HttpServletRequestWrapper,主要是重写了 getRemoteUser() 方法,只要在前面配置 CASFilter 的时候为其设置“ edu.yale.its.tp.cas.client.filter.wrapRequest ”参数为 true,就可以通过 getRemoteUser() 方法来获取登录用户名,具体方法如清单 13 所示:


清单 13. 通过 CASFilterRequestWrapper 获取登录用户名

CASFilterRequestWrapper  reqWrapper=new CASFilterRequestWrapper(request);out.println("The logon user:" + reqWrapper.getRemoteUser());
?

public class WelcomePage extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>Welcome to casTest2 sample System!</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>Welcome to casTest1 sample System!</h1>"); CASFilterRequestWrapper reqWrapper=new CASFilterRequestWrapper(request); out.println("<p>The logon user:" + reqWrapper.getRemoteUser() + "</p>"); HttpSession session=request.getSession(); out.println("<p>The logon user:" + session.getAttribute(CASFilter.CAS_FILTER_USER) + "</p>"); out.println("<p>The logon user:" + session.getAttribute("edu.yale.its.tp.cas.client.filter.user") + "</p>"); out.println("</body>"); out.println("</html>"); }}?

在上面所有配置结束过后,分别在 A, B, C上启动 cas, casTest1 和 casTest2,按照下面步骤来访问 casTest1 和 casTest2:

  1. 打开浏览器,访问?http://domainB:8080/casTest1/WelcomePage?,浏览器会弹出安全提示,接受后即转到 CAS 的登录页面,如图 2 所示:


图 2. CAS 登录页面
应用 CAS 在 Tomcat 中实现单点登录(部署客户端应用)?

  1. 登录成功后,再重定向到 casTest1 的 WelcomePage 页面,如图?所示:


图 3. 登录后访问 casTest1 的效果
应用 CAS 在 Tomcat 中实现单点登录(部署客户端应用)?

可以看到图?中地址栏里的地址多出了一个 ticket 参数,这就是 CAS 分配给当前应用的 ST(Service Ticket)。

  1. 再在同一个浏览器的地址栏中输入?http://domainC:8080/casTest2/WelcomePage?,系统不再提示用户登录,而直接出现如图 4 所示的页面,并且显示在 casTest1 中已经登录过的用户。


图 4. 在 casTest1 中登录过后访问 casTest2 的效果
应用 CAS 在 Tomcat 中实现单点登录(部署客户端应用)?

  1. 重新打开一个浏览器窗口,先输入?http://domainC:8080/casTest2/WelcomePage?,系统要求登录,在登录成功过后,正确显示 casTest2 的页面。之后再在地址栏重新输入?http://domainB:8080/casTest1/WelcomePage?,会直接显示 casTest1 的页面而无需再次登录。

?

热点排行