单点登录配置指北

单点登录配置文件

标签(空格分隔): 单点 配置


公司系统升级,需要搭建一个单点登录的统一入口,完成后记录。

1 环境搭建

原始版:
方法一:cas-server-3.5.2 到路径/modules下下拷贝cas-server-webapp-3.5.2.war这个war包至tomcat的webapps目录下。为了登录方便,我们将cas-server-webapp-3.5.2.war重命名为cas.war,启动tomcat以后会自动解压缩这个war,在webapps目录下生一个一个cas目录。在lib中引入对应的数据库驱动包。
方法二:重新编译cas-server-webapp 在Lib中加载cas-server-support-jdbc,对应的数据库驱动包或其他包。

已解压版:cas服务端放到tomcat下,mysql数据库Lib中引入mysql驱动,oracle引入oracle驱动
其中webapp 是默认的包 其他是扩展包 加入扩展包时必须加入core包

2 Server端修改

2.1 WEB-INF下

2.1.1 cas.properties

Service.name 可以对应修改 service的url
service.name=http://localhost:8080
Host.name表示当前服务器的名字,在日志中会显示,布集群的话这里需要修改每个hotsname不能相同
host.name=cas01.example.org

2.1.2 cas-servlet.xml

指定了一些servlet的配置 修改p:followServiceRedirects=true 在退出时会跳到指定的service页面 (就是链接后面跟的)而不是默认的Logout页面

2.1.3 deployerConfigContext.xml
<!--自己扩展-->
            <bean
                class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
                <property name="dataSource" ref="dataSource"></property>
                <property name="sql"
                    value="select password from tbl_yh where username=?">
                </property>
                <property name="passwordEncoder"
                    ref="myPasswordEncoder">
                </property>
            </bean>

这是数据库读取密码的sql 可以自定义 写入cas-server-support-jdbc-**.jar包即可

<bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
    <property name="url" value="jdbc:oracle:thin:@ip:port:实例名" />
    <property name="username" value="*******" />
    <property name="password" value="*******" />
</bean>

这里配置密码所在的数据库 可用mysql/oracle等数据库 导入相应驱动即可

2.1.4 messages_zh_CN.properties

修改提示语,\classes\messages_zh_CN.properties 可修改提示语等 写入对应unicode编码 即可对应显示 (用户名或密码错误)

if (!dbPassword.equals(pwd)) {
        throw new BadPasswordAuthenticationException();
      }

 public BadPasswordAuthenticationException()
  {
    super("error.authentication.credentials.bad.usernameorpassword.password");
  }

error.authentication.credentials.bad.usernameorpassword.password=\u7528\u6237\u540d\u6216\u5bc6\u7801\u9519\u8bef

2.1.5 取消HTTPS协议:(转载)
2.1.5.1 打开 cas-server\WEB-INF\deployerConfigContext.xml 文件 ,找到如下配置:
<!-- Required for proxy ticket mechanism. -->
<bean id="proxyAuthenticationHandler" 
class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
p:httpClient-ref="httpClient" />

增加参数p:requireSecure=”false”,是否需要安全验证,即HTTPS,false为不采用。修改后为:

<bean id="proxyAuthenticationHandler" 
class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
p:httpClient-ref="httpClient" p:requireSecure="false" />
2.1.5.2打开 cas-server\WEB-INF\spring-configuration\ticketGrantingTicketCookieGenerator.xml ,找到如下配置:
<bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
    p:cookieSecure="true"
    p:cookieMaxAge="-1"
    p:cookieName="CASTGC"
    p:cookiePath="/cas" />

修改 p:cookieSecure=”true” 为 p:cookieSecure=”false”
即不开启https验证

2.1.5.3打开 cas-server\WEB-INF\spring-configuration\warnCookieGenerator.xml ,找到如下配置:
<bean id="warnCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
    p:cookieSecure="true"
    p:cookieMaxAge="-1"
    p:cookieName="CASPRIVACY"
    p:cookiePath="/cas" />

修改 p:cookieSecure=”true” 为 p:cookieSecure=”false”
即不开启https验证

2.1.6 自定义登录页面(转载)

指定了界面生成 修改其中cas.viewResolver.basename=myview
则所有样式界面样式都从WEB-INF/classes/myview.properties 指定的路径中读取
参见自定义登录界面参考
其实CAS所有的界面位置都是在cas.properties(具体位置:cas\WEB-INF\cas.properties)中指定的。我们打开这个文件,找到下面这行

cas.securityContext.status.allowedSubnet=127.0.0.1

cas.themeResolver.defaultThemeName=cas-theme-default

//注意下面这行
cas.viewResolver.basename=default_views

  看cas.viewResolver.basename 这个键值对,它的值是default_views,表示的是默认的视图配置,其实是一个properties文件的名称而已。大家找找看,在工程中是不是有一个名为default_views.properties(具体位置:cas\WEB-INF\classes\default_views.properties )的文件,文件的具体内容如下:

casLoginView.(class)=org.springframework.web.servlet.view.JstlView
casLoginView.url=/WEB-INF/view/jsp/default/ui/casLoginView.jsp

Display login (warning) messages

casLoginMessageView.(class)=org.springframework.web.servlet.view.JstlView
casLoginMessageView.url=/WEB-INF/view/jsp/default/ui/casLoginMessageView.jsp

Login confirmation view (logged in, warn=true)

casLoginConfirmView.(class)=org.springframework.web.servlet.view.JstlView
casLoginConfirmView.url=/WEB-INF/view/jsp/default/ui/casConfirmView.jsp

Logged-in view (logged in, no service provided)

casLoginGenericSuccessView.(class)=org.springframework.web.servlet.view.JstlView
casLoginGenericSuccessView.url=/WEB-INF/view/jsp/default/ui/casGenericSuccess.jsp

Logout view (/logout)

casLogoutView.(class)=org.springframework.web.servlet.view.JstlView
casLogoutView.url=/WEB-INF/view/jsp/default/ui/casLogoutView.jsp

可以看到我们的登录页面就是配置在上面的, 里面还配置了 登录成功页面,退出页面等,这个后面会具体说明。

我们知道了页面配置后,那么是不是可以根据业务来具体订制一套页面了。

1.在cas.properties 修改 cas.viewResolver.basename 值为 bokeyuan_view ,那样系统就会自动会查找 bokeyuan_view.properties 这个配置文件

2.第1点中查找的 bokeyuan_view.properties 是没有的,我们要自己新建,直接复制原来的 default_views.properties 就行了,重命名为bokeyuan_view.properties

3.但是bokeyuan_view.properties 中的地址还是 /WEB-INF/view/jsp/default ,我们全部替换把这地址替换成 WEB-INF\view\jsp\bokeyuan

4.接下来我们把 cas\WEB-INF\view\jsp\default 下面的所有文件复制下,然后重命名为我们需要的名称,cas\WEB-INF\view\jsp\bokeyuan

5.这样我们就可以可以随意修改登录界面了

ps:有人说直接修改原来的 cas\WEB-INF\view\jsp\default\ui\casLoginView.jsp 就行了,省得麻烦。 其实这样也是行的,但这样如果后面需要初始的界面,那样就没了。

采用配置修改的方式主要会更加灵活点,可以保留原来的备份。

pps:登录界面中的jquery库 是配置在cas\WEB-INF\view\jsp\default\ui\includes\bottom.jsp中的,但是这个是直接引用googleapis 的,我们是不能访问的,需要修改成你本地或者能够访问的CDN库(百度CDN、360CDN 等)

ppps:你可以随意修改原来的界面,但是原来的逻辑不能修改,其实主要是 form:form 这标签里的东西不要变了。反正你只修改样式,是肯定不会错的

2.2 密码验证修改

上文deployerConfigContent.xml所做的仅仅是查出用户名和密码,一般来说数据库中不会是明文存储用户名密码的需要做一定的转码 所需要在QueryDatabaseAuthenticationHandler 做一定的修改,在cas-server-support-jdbc-3.5.2.1.jar中修改为

package org.jasig.cas.adaptors.jdbc;

import javax.validation.constraints.NotNull;
import org.jasig.cas.adaptors.utils.Arith;
import org.jasig.cas.adaptors.utils.MD5EncryptUtils;
import org.jasig.cas.authentication.handler.AuthenticationException;
import org.jasig.cas.authentication.handler.BadPasswordAuthenticationException;
import org.jasig.cas.authentication.handler.PrincipalNameTransformer;
import org.jasig.cas.authentication.principal.UsernamePasswordCredentials;
import org.springframework.dao.IncorrectResultSizeDataAccessException;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;

public class QueryDatabaseAuthenticationHandler
        extends AbstractJdbcUsernamePasswordAuthenticationHandler
{
    @NotNull
    private String sql;

    protected boolean authenticateUsernamePasswordInternal(UsernamePasswordCredentials credentials)
            throws AuthenticationException
    {
        String username = getPrincipalNameTransformer().transform(credentials.getUsername());
        String password = credentials.getPassword();


        try
        {
            String dbPassword = (String)getJdbcTemplate().queryForObject(this.sql, String.class, new Object[] { username });
            if (dbPassword.equals(你得到的字符串)) {
                throw new BadPasswordAuthenticationException();
            }
            return dbPassword.equals(你得到的字符串);
        }
        catch (IncorrectResultSizeDataAccessException localIncorrectResultSizeDataAccessException) {}
        return false;
    }

    public void setSql(String sql)
    {
        this.sql = sql;
    }


}

3 Client端修改

3.1 Web.xml部分

3.1.1 完整 web.xml部分
    <!--     用于单点退出,该过滤器用于实现单点登出功能,必须放在listener第一位 -->
<listener>
   <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>
<!--该过滤器用于实现单点登出功能,必须放在filter第一位-->
<filter>
   <filter-name>CASSingleSignOutFilter</filter-name>
   <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
</filter>
<filter-mapping>
   <filter-name>CASSingleSignOutFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>


<context-param>
   <param-name>casServerLogoutUrl</param-name>
   <param-value>http://localhost:8080/cas</param-value>
</context-param>
<!--    单点登陆退出后跳转地址 -->
<context-param>
   <param-name>jumpindexUrl</param-name>
   <param-value>http://localhost:8089</param-value>
</context-param>





<!--     该过滤器负责用户的认证工作,必须启用它 -->
<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>http://localhost:8080/cas</param-value>
      <!--             这里的server是服务端的IP -->
   </init-param>
   <init-param>
      <param-name>serverName</param-name>
      <param-value>http://localhost:8089</param-value>
   </init-param>
   <init-param>
      <param-name>ignorePattern</param-name>
      <param-value>
      </param-value>
   </init-param>
</filter>
<!--     该过滤器负责对Ticket的校验工作,必须启用它 -->
<filter>
   <filter-name>CAS Validation Filter</filter-name>
   <filter-class>
      org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
   <init-param>
      <param-name>casServerUrlPrefix</param-name>
      <param-value>http://localhost:8080/cas</param-value>
   </init-param>
   <init-param>
      <param-name>serverName</param-name>
      <param-value>http://localhost:8089</param-value>
   </init-param>
   <init-param>
      <param-name>redirectAfterValidation</param-name>
      <param-value>true</param-value>
   </init-param>
</filter>
<!--      该过滤器负责实现HttpServletRequest请求的包裹, 比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。   -->
<filter>
   <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
   <filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
</filter>
<filter-mapping>
   <filter-name>CASFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
   <filter-name>CAS Validation Filter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
   <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

<!--     该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。 比如AssertionHolder.getAssertion().getPrincipal().getName()。   -->
<filter>
   <filter-name>CAS Assertion Thread Local Filter</filter-name>
   <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
</filter>
<filter-mapping>
   <filter-name>CAS Assertion Thread Local Filter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>
3.1.2 Web.xml中认证url修改
<!--     该过滤器负责用户的认证工作,必须启用它 -->
<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>http://localhost:8080/cas</param-value>
      <!--             这里的server是服务端的IP -->
   </init-param>
   <init-param>
      <param-name>serverName</param-name>
      <param-value>http://localhost:8089</param-value>
   </init-param>
   <init-param>
      <param-name>ignorePattern</param-name>
      <param-value>
      </param-value>
   </init-param>
</filter>
 <!--     该过滤器负责对Ticket的校验工作,必须启用它 -->
<filter>
   <filter-name>CAS Validation Filter</filter-name>
   <filter-class>
      org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
   <init-param>
      <param-name>casServerUrlPrefix</param-name>
      <param-value>http://localhost:8080/cas</param-value>
   </init-param>
   <init-param>
      <param-name>serverName</param-name>
      <param-value>http://localhost:8089</param-value>
   </init-param>
   <init-param>
      <param-name>redirectAfterValidation</param-name>
      <param-value>true</param-value>
   </init-param>
</filter>

此处必须要修改 上面为service地址,下面为client端地址 ignorePattern为忽略配置 必须写在一行里(这里是不进入单点验证的地址:如http://ip:port/redirect.jsp)如果所有地址都要登录验证可不写 例如:

<param-value>/redirect.jsp</param-value>
3.1.3 Web.xml中登出url修改

登录就在web.xml配置即可,如果带有单点登录标识 直接根据用户名查出密码等值set到loginvo中模拟登录,如果没有正常验证密码流程

<context-param>
   <param-name>casServerLogoutUrl</param-name>
   <param-value>http://localhost:8080/cas</param-value>
</context-param>
<!--    单点登陆退出后跳转地址 -->
<context-param>
   <param-name>jumpindexUrl</param-name>
   <param-value>http://localhost:8089</param-value>
</context-param>

这里是单点登录的服务器 配置后 jumpindexUrl为client端

3.1.4 其他要注意的事项

单点登出的filter 和listener必须写在第一个filter和listener 不然会报xml解析异常。单点登录原理此处不赘述,请自行百度。

3.2登出代码端修改

3.2.1登出时跳转方法

退出时引用此处 如http://cas-server-ip:cas-server-port/cas/logout?serivce=http://cas-client-ip:cas-client-port(会转义)

if("ssologin".equals(res.getMessage())){
   HttpServletRequest request = ContextAPI.getReq();
   String server = request.getSession().getServletContext()
   .getInitParameter("casServerLogoutUrl");
   // 客户端
   // 统一身份认证集成手册
   String client = request.getSession().getServletContext().getInitParameter("jumpindexUrl");
         if (!"".equals(StringUtils.nullToString(server))) {
      server = server.replaceAll("\\\\", "");
      server = server + "/logout";
      if (!"".equals(StringUtils.nullToString(client))) {

         server = server + "?service=" + client + request.getContextPath();
         System.out.println("这是单点logout:" + server);
         request.getSession().invalidate();
      }
   }
   res.addAttr("logouturl", server);
   loginpage = "pages/main/login/ssologout.jsp";

}     
3.2.2 ssologout.jsp
    <script>function init(){
       var res = pc.getInitData();
       var logouturl =  res.getAttr("logouturl");
        window.location.href=logouturl;
    };
    </script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值