统一用户登陆系统

 

单点登陆的定义

          

简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

     

技术实现机制

     当用户第一次访问应用系统1的时候,因为还没有登录,会被引导到认证系统中进行登录;根据用户提供的登录信息,认证系统进行身份效验,如果通过效验,应该返回给用户一个认证的凭据--ticket;用户再访问别的应用的时候,就会将这个ticket带上,作为自己认证的凭据,应用系统接受到请求之后会把ticket送到认证系统进行效验,检查ticket的合法性。如果通过效验,用户就可以在不用再次登录的情况下访问应用系统2和应用系统3了。

 

开源的jasig单点登入系统包括如下:

      cas-server-3.4.10:统一用户登入的验证系统

      cas-client-3.2.1 用户客户端引入的文件

 

java系统为例:

 

统一用户系统的集成步骤:

http://www.ja-sig.org/downloads/cas-clients/

 

1)下载cas客户端jar

cas-client-core-3.2.1.jar

把此jar包放到WEB-INF\lib目录下

 

2)修改web.xml添加cas过滤器filter

 

    <!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置-->

<listener>

       <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>

</listener>

 

<!-- 该过滤器用于实现单点登出功能,可选配置。 -->

<filter>

       <filter-name>CASSingle Sign Out Filter</filter-name>

       <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>

</filter>

<filter-mapping>

       <filter-name>CASSingle Sign Out Filter</filter-name>

       <url-pattern>/*</url-pattern>

</filter-mapping>

 

<!-- 该过滤器负责用户的认证工作,必须启用它 -->

<filter>

       <filter-name>CASFilter</filter-name>

       <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>

       <init-param>

              <param-name>casServerLoginUrl</param-name>

              <param-value>https://sso.haier.com:8443/cas/login</param-value>

              <!--这里的server是服务端的IP-->

       </init-param>

       <init-param>

              <param-name>serverName</param-name>

              <param-value>http://www.haiertest.com:58080</param-value>

       </init-param>

</filter>

<filter-mapping>

       <filter-name>CASFilter</filter-name>

       <url-pattern>/*</url-pattern>

</filter-mapping>

 

<!-- 该过滤器负责对Ticket的校验工作,必须启用它 -->

<filter>

       <filter-name>CASValidation Filter</filter-name>

       <filter-class>

              org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>

       <init-param>

              <param-name>casServerUrlPrefix</param-name>

              <param-value>https://sso.haier.com:8443/cas</param-value>

       </init-param>

       <init-param>

              <param-name>serverName</param-name>

              <param-value>http://www.haiertest.com:58080</param-value>

       </init-param>

</filter>

<filter-mapping>

       <filter-name>CASValidation Filter</filter-name>

       <url-pattern>/*</url-pattern>

</filter-mapping>

 

<!--

       该过滤器负责实现HttpServletRequest请求的包裹,

       比如允许开发者通过HttpServletRequestgetRemoteUser()方法获得SSO登录用户的登录名,可选配置。

-->

<filter>

       <filter-name>CASHttpServletRequest Wrapper Filter</filter-name>

       <filter-class>

              org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>

</filter>

<filter-mapping>

       <filter-name>CASHttpServletRequest Wrapper Filter</filter-name>

       <url-pattern>/*</url-pattern>

</filter-mapping>

 

<!--

       该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。

       比如AssertionHolder.getAssertion().getPrincipal().getName()

-->

<filter>

       <filter-name>CASAssertion Thread Local Filter</filter-name>

       <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>

</filter>

<filter-mapping>

       <filter-name>CASAssertion Thread Local Filter</filter-name>

       <url-pattern>/*</url-pattern>

</filter-mapping>

 

<!-- 自动根据单点登录的结果设置本系统的用户信息 -->

<filter>

       <display-name>AutoSetUserAdapterFilter</display-name>

       <filter-name>AutoSetUserAdapterFilter</filter-name>

       <filter-class>com.haier.demo.filter.AutoSetUserAdapterFilter</filter-class>

</filter>

<filter-mapping>

       <filter-name>AutoSetUserAdapterFilter</filter-name>

       <url-pattern>/*</url-pattern>

</filter-mapping>

<!-- ======================== 单点登录结束 ======================== -->

        

 

 

 

 

3) 添加AutoSetUserAdapterFilter这个类,来自动根据CAS信息设置Session的用户信息,

主要是通过CAS_const_cas_assertion_获取从CAS服务器登陆的用户名,然后再根据系统内部的用户工具(UserUtil.java)来判断是否已经登录过,如果没有登录根据登录名从数据库查询用户信息,最后使用设置把用户信息设置到当前session中。
这样就把用户信息保存到了Sessino中,我们就可以通过UserUtil工具来获取当前登录的用户了

     

 

public class AutoSetUserAdapterFilter implements Filter {

       

        /**

         * Defaultconstructor.

         */

        publicAutoSetUserAdapterFilter() {

        }

 

        /**

         * @seeFilter#destroy()

         */

        public voiddestroy() {

        }

 

        /**

         * 过滤逻辑:首先判断单点登录的账户是否已经存在本系统中,

         * 如果不存在使用用户查询接口查询出用户对象并设置在Session

         * @seeFilter#doFilter(ServletRequest, ServletResponse, FilterChain)

         */

        public voiddoFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException,

                       ServletException {

                HttpServletRequest httpRequest =(HttpServletRequest) request;

               

                //_const_cas_assertion_CAS中存放登录用户名的session标志

                Objectobject =httpRequest.getSession().getAttribute("_const_cas_assertion_");

               

                if(object != null) {

                       Assertion assertion = (Assertion) object;

                       String loginName = assertion.getPrincipal().getName();

                       User user = UserUtil.getCurrentUser(httpRequest.getSession());

                       

                       // 第一次登录系统

                       if (user == null) {

                               WebApplicationContext wct =WebApplicationContextUtils.getWebApplicationContext(httpRequest

                                               .getSession().getServletContext());

                                UserManageruserManager = (UserManager) wct.getBean("userManager");

                                user =userManager.findUserByLoginName(loginName);

                                // 保存用户信息到Session

                               UserUtil.saveUserToSession(httpRequest.getSession(), user);

                       }

                       

                }

               chain.doFilter(request, response);

        }

 

        /**

         * @seeFilter#init(FilterConfig)

         */

        public voidinit(FilterConfig fConfig) throws ServletException {

        }

}

 

相关知识:http://hhw3.blog.163.com/blog/static/2690966201411265579770/

你可能感兴趣的:(SSO,cas,单点登录)