一种注册后自动登录CAS单点登录系统的方法

集成了单点登录的Web应用,现在有这样的需求:
1. 因为各个Web应用注册时要求的信息有差异,因此注册功能在Web应用中单独实现,不在CAS单点登录系统中提供
2. 要求在Web应用注册后,不需要用户输入用户名和密码,自动向CAS发起登录

实现的方法应该有多种,这里提供一个开发比较简单的思路。
1. 仿照CAS的Rest API,开发一个登录验证的API,这个API比较特殊的处理是需要写Cookie。
2. Web服务端注册之后,开一个iframe,submit到上面的登录验证的API。这样登录验证成功之后,浏览器里就会有CAS服务器的TGT Cookie信息。

关键代码如下:
1 web.xml中增加restlet的处理,如果已经添加的话,跳过

<servlet>
    <servlet-name>restlet</servlet-name>
    <servlet-class>org.restlet.ext.spring.RestletFrameworkServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>restlet</servlet-name>
    <url-pattern>/v1/*</url-pattern>
</servlet-mapping>

2 restlet-servlet.xml文件中增加登录验证API

<entry key="/muteLogin">
    <bean class="org.restlet.ext.spring.SpringFinder">
        <lookup-method name="create" bean="muteLoginResource" />
    </bean>
</entry>

<bean id="muteLoginResource" class="com.example.MuteLoginResource" scope="prototype" />

3 MuteLoginResource的代码中验证登录,并写入cookie

final String ticketGrantingTicketId = this.centralAuthenticationService.createTicketGrantingTicket(c);
final String serviceTicketId = this.centralAuthenticationService.grantServiceTicket(
    ticketGrantingTicketId, new WebApplicationServiceImpl(service, null, null, null, null));

CookieRetrievingCookieGenerator cookieGenerator =
(CookieRetrievingCookieGenerator) Const.WEB_APP_CONTEXT.getBean("ticketGrantingTicketCookieGenerator");
CookieSetting cookieSetting = new CookieSetting(0, cookieGenerator.getCookieName(), ticketGrantingTicketId, cookieGenerator.getCookiePath(), null);
this.getResponse().getCookieSettings().add(cookieSetting);

this.getResponse().redirectPermanent(service + "?ticket=" + serviceTicketId);

4 最后写一个html iframe测试一下

<html>
  <head>
      <title>Status page</title>
  </head>
  <body style="font-family: sans-serif;">
      <script language="javascript">
        window.onload=function() {
          ifr.document.open();
          ifr.document.write("<html><body>");
          ifr.document.write("<form id='form1' name='form1' id='form1' width='1' height='1' method='post' action='http://localhost:8080/cas/v1/muteLogin'>");
          ifr.document.write("<input id='service' name='service' value='http://test.com/shiro-cas'/>");
          ifr.document.write("<input id='username' name='username' value='18011111111'/>");
          ifr.document.write("<input id='password' name='password' value='123456'/>");
          ifr.document.write("</form>");
          ifr.document.write("</body></html>");
          ifr.document.close();
        }

        function doSomething() {
          parent.ifr.form1.submit();
          alert('finished');
        }
      </script>

      <iframe name="ifr" id="ifr" style="display:none"></iframe>
      <input type="button" onclick="doSomething()" value="Click me"/>
    </body>
</html>

供参考

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值