CAS单点登录概念说明
去除SSL认证设置
CAS配置数据库用户名和密码
i18n和语言国际化处理
springSecurity整合cas
user中心Spring整合cas
单点登出到指定页面
2019年3月22日00:04:33(这个博客没时间写了,先把随记文档放在这里)
一、CAS服务端部署及配置
//1.将资源中提供的cas.war包部署到tomcat的服务器上(拷贝到webapps目录)
//2.用户名:casuser 密码:Mellon,(deployerConfigContext.xml可修改用户名,密码)
//3.测试地址http://localhost:9100/cas
//4.修改端口号需要tomcat改,和cas的WEB-INF/cas.properties(server.name=http://localhost:9100)
//5.测试新的端口地址确认没问题http://localhost:9100/cas
去除https认证的三个步骤:
https:需要申请和够买SSL安全证书,有单独的认证机构,申请SSL后安装到服务器上
(1)修改cas的WEB-INF/deployerConfigContext.xml
//增加p:requireSecure="false"是否需要安全认证,即关闭HTTPS协议
//p:p命名空间 相当于在类里声明了该属性
<bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler" p:httpClient-ref="httpClient" p:requireSecure="false"/>
(2)找个最长的,修改cas的/WEB-INF/spring-configuration/ticketGrantingTicketCookieGenerator.xml
//修改两处
//cookieSecure为HTTPS验证相关,cookieMaxAge为COOKIE的最大生命周期,-1关闭浏览器就失效,秒为单位
<bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
p:cookieSecure="false" //修改true为false
p:cookieMaxAge="3600" //修改-1为3600(1小时)
p:cookieName="CASTGC"
p:cookiePath="/cas" />
(3)修改cas的WEB-INF/spring-configuration/warnCookieGenerator.xml修改方法同上
二、CAS客户端Demo 单点登录
1.创建casclient_demo的war工程,端口号设定9001(测试临时占用)
2.拷贝资源->配置文件中CAS目录下的pom.xml及web.xml文件
3.注意web.xml中配置的CAS服务器地址端口号,和本地地址端口号都是否正确
4.编写登录后进入的首页(index.jsp)
<body>
非洲大草原欢迎你心中的千马奔腾
<%=request.getRemoteUser()%>
</body>
5.创建casclient_demo2的war工程,端口号设定9002(测试临时占用),其他模仿demo1
三、单点退出登录,测试时注意清除浏览器缓存,改配置的时候,先关闭掉tomcat
<a href="http://localhost:9100/cas/logout">退出登录</a>
如果想退出跳转到指定页面,修改cas系统的配置文件cas-servlet.xml
//最后一个参数followServiceRedirects换成true
<bean id="logoutAction" class="org.jasig.cas.web.flow.LogoutAction"
p:servicesManager-ref="servicesManager"
p:followServiceRedirects="${cas.logout.followServiceRedirects:true}"/>
//之后页面的链接跳转增加service,注意写全访问路径
<a href="http://localhost:9100/cas/logout?service=https://www.baidu.com/">退出登录</a>
测试http://localhost:9002/casclient_demo2和http://localhost:9001/casclient_demo1
四、CAS服务端配置数据源
1.3个jar包放到cas项目的WEB-INF\lib目录下(负责访问数据库)
2.deployerConfigContext.xml ,添加如下配置
//文档下面加上
<!--c3p0数据源的配置-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
p:driverClass="com.mysql.jdbc.Driver"
p:jdbcUrl="jdbc:mysql://127.0.0.1:3306/myApplicationdb?characterEncoding=utf8"
p:user="root"
p:password="root" />
<!--密码用了md5所以需要配置对应p:passwordEncoder-ref-->
<bean id="passwordEncoder"
class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder"
c:encodingAlgorithm="MD5"
p:characterEncoding="UTF-8" />
<!--负责验证用户登录-->
<bean id="dbAuthHandler"
class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"
p:dataSource-ref="dataSource"
p:sql="select password from tb_user where username = ?"
p:passwordEncoder-ref="passwordEncoder"/>
<!--文档上面找到将primaryAuthenticationHandler改为dbAuthHandler
<entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" />-->
3.测试用数据库中的用户名密码进行登录
五、修改cas的登录页面效果 apache-tomcat\webapps\cas\WEB-INF\view\jsp\default\ui
//添加指令
<%@ page pageEncoding="UTF-8" %>
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
//修改form标签大致49行
<form:form method="post" id="fm1" commandName="${commandName}" htmlEscape="true" class="sui-form">
//修改用户名框
<form:input id="username" tabindex="1" accesskey="${userNameAccessKey}" path="username" autocomplete="off" htmlEscape="true" placeholder="邮箱/用户名/手机号" class="span2 input-xfat" />
//修改密码框
<form:password id="password" tabindex="2" path="password" accesskey="${passwordAccessKey}" htmlEscape="true" autocomplete="off" placeholder="请输入密码" class="span2 input-xfat" />
//修改登录按钮
<input type="hidden" name="lt" value="${loginTicket}" />//登录票据相关
<input type="hidden" name="execution" value="${flowExecutionKey}" />
<input type="hidden" name="_eventId" value="submit" />
<input class="sui-btn btn-block btn-xlarge btn-danger" accesskey="l" value="登 录" type="submit" />
</form:form>
5.中文错误提示
首先加入错误提示框
//<form:form 表单行下直接加入如下配置
<form:errors path="*" id="msg" cssClass="errors" element="div" htmlEscape="false" />
WEB-INF\classes\messages.properties文件有关于错误信息的描述
authenticationFailure.AccountNotFoundException=Invalid credentials.
authenticationFailure.FailedLoginException=Invalid credentials.
首先设置国际化en改为zn_CN,修改cas-servlet.xml
//之前是en改成zh_CN
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver" p:defaultLocale="zh_CN" />
在messages_zh_CN.properties下增加中文提示
authenticationFailure.AccountNotFoundException=\u7528\u6237\u4E0D\u5B58\u5728.
authenticationFailure.FailedLoginException=\u5BC6\u7801\u9519\u8BEF.
六、CAS客户端与SpringSecurity集成
1.建立casclient_demo3新工程,或者在demo1上进行改造,改成支持springSecurity的
//1.拷贝pom.xml坐标,端口号设置为9003
//2.拷贝web.xml其中就是springSecurity和springmvc的内容
//3.拷贝spring的配置文件
//4.拷贝UserDetailServiceImpl.java这个不是为了认证,而是为了加用户角色信息(可以拷贝shop-web)
2.创建UserController.java类
package cn.itcast.demo.controller;
@RestController
public class UserController {
@RequestMapping("/findLoginUser")
public void findLoginUser(){
String name = SecurityContextHolder.getContext().getAuthentication().getName();
System.out.println(name);
}
}
3.测试地址栏输入http://localhost:9003/casclient_demo3/findLoginUser.do即可在控制台输出的登录名
4.退出登录—设置退出后的页面,修改spring-security.xml
//将之前的百度地址改成要跳转的页面
<beans:constructor-arg value="http://localhost:9100/cas/logout?service=http://localhost:9003/index.jsp"/>
//index.html增加退出
<a href="logout/cas">退出登录</a>
七、品优购用户中心
1.将home开头的页面全部拷贝到user-web工程
//pom坐标信息这部分内容可以忽略,父工程已经导入四个依赖的坐标,其中包括security和对cas支持的
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-cas</artifactId>
<version>4.1.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.jasig.cas.client</groupId>
<artifactId>cas-client-core</artifactId>
<version>3.3.3</version>
<!-- 排除log4j包冲突 -->
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>4.1.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>4.1.0.RELEASE</version>
</dependency>
2.web.xml设置首页,设置springSecurity的过滤器,注意classpath:spring-security.xml路径
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-security.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>home-index.html</welcome-file>
</welcome-file-list>
4.user-web工程下,创建com.myApplication.user.service包,拷贝UserDetailsServiceImpl.java
5.拷贝spring-security.xml并进行修改,测试登录并看效果
//1.可匿名访问的资源
<http pattern="/css/**" security="none"></http>
<http pattern="/js/**" security="none"></http>
<http pattern="/image/**" security="none"></http>
<http pattern="/plugins/**" security="none"></http>
<http pattern="/register.html" security="none"></http>
<http pattern="/user/add.do" security="none"></http>
<http pattern="/user/sendCode.do" security="none"></http>
//2.配置自身工程地址
<!--service 配置自身工程的根地址+/login/cas -->
<beans:property name="service" value="http://localhost:9106/login/cas"/>
//3.设置认证类
<beans:bean id="userDetailsService" class="com.myApplication.user.service.UserDetailServiceImpl"/>
测试运行查看效果
6.显示用户名,修改UserController.java增加showName方法
//UserController增加显示用户名方法
@RequestMapping("/showName")
public Map showName(){
String name = SecurityContextHolder.getContext().getAuthentication().getName();//得到登陆人账号
Map map=new HashMap<>();
map.put("loginName", name);
return map;
}
//修改userService.js
this.showName=function(){
return $http.get('user/showName.do');
}
修改userController.js
$scope.showName=function(){
userService.showName().success(
function(response){
$scope.loginName=response.loginName;
}
);
}
home-index.html修改
//引入js
<script type="text/javascript" src="plugins/angularjs/angular.min.js"></script>
<script type="text/javascript" src="js/base.js"></script>
<script type="text/javascript" src="js/service/userService.js"></script>
<script type="text/javascript" src="js/controller/baseController.js"></script>
<script type="text/javascript" src="js/controller/userController.js"></script>
//body调用指令
<body ng-app="myApplication" ng-controller="userController" ng-init="showName()">
//大约162行的用户名改成动态获取
<span class="name">{{loginName}}</span>
7.退出登录功能,修改spring-security.xml
//单点登出的地址
<beans:constructor-arg value="http://localhost:9100/cas/logout?service=http://localhost:9103"/>
//修改home-index.html页面退出登录链接修改为
<a href="/logout/cas">退出登录 </a>