CAS 之 Https And Database Authentication(三)
CAS 之 Https And Database Authentication(三)
标签(空格分隔): CAS
Intro(介绍)
由上节可知Apereo CAS
官方默认使用 https 的方式进行部署:
为了安全,我们使用https方式,并禁用静态账户信息。
What you’ll need(需要掌握)
- JDK 1.8 or later
- Maven 3.2+
- spring boot
- Spring Tool Suite (STS)
- IntelliJ IDEA
- keytool
生成证书
生成key
keytool -genkey -alias ssokeystore -keyalg RSA -keysize 2048 -keypass 123456 -storepass 123456 -keystore D:/sso/sso.keystore -dname "CN=www.galsang.org,OU=galsang.org,O=galsang,L=Shanghai,ST=Shanghai,C=CN" -ext "san=dns:www.galsang.org,ip:192.168.6.53"
导出证书
keytool -export -file D:/sso/ssokeystore.crt -alias ssokeystore -keystore D:/sso/sso.keystore -keypass 123456 -storepass 123456
# 或
keytool -exportcert -alias ssokeystore -keystore D:/sso/sso.keystore -file D:/sso/ssokeystore.crt -keypass 123456 -storepass 123456
导入证书到本地JDK(客户端认证)
keytool -import -alias ssokeystore -keystore D:/javaspace/Java/jdk1.8.0_131/jre/lib/security/cacerts -file D:/sso/ssokeystore.crt -keypass changeit -storepass changeit
删除证书
如果之前导入过该别名ssokeystore
的证书,则删除证书
keytool -delete -alias ssokeystore -keystore D:/javaspace/Java/jdk1.8.0_131/jre/lib/security/cacerts -keypass changeit -storepass changeit
查看密钥库证书
keytool -list -keystore D:/javaspace/Java/jdk1.8.0_131/jre/lib/security/cacerts -keypass changeit -storepass changeit
查看指定证书内容
keytool -printcert -file "D:/sso/ssokeystore.crt "
https 配置
步骤一:将生成的密钥 sso.keystore
拷贝至 src/main/resources
目录下
步骤二:进行配置
由于5.2.0
版本是默认是开启的,这里先关闭,后期上生产之前再开启并进行配置:
Ticket Granting Cookie
cas:
tgc:
secure: false # cas.tgc.secure=true
步骤三:进行application.yml
配置
笔者喜欢使用yml
文件的方式进行配置,故将application.properties
文件中的配置迁移至application.yml
,但依然要保留application.properties
文件将原始war中的application.properties
文件覆盖,这是因为 maven-war-plugin/overlays
的缘故。
spring:
application:
name: cas-server
http:
encoding:
enabled: true
charset: UTF-8
force: true
thymeleaf:
encoding: UTF-8
cache: true
mode: HTML
aop:
auto: true
proxy-target-class: true
# CAS Server Context Configuration
server:
context-path: /cas
port: 8443
max-http-header-size: 2097152
use-forward-headers: true
connection-timeout: 20000
error:
include-stacktrace: ALWAYS
compression:
enabled: true
mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain
ssl:
key-store: classpath:sso.keystore
key-store-password: 123456
key-password: 123456
enabled: true
tomcat:
max-http-post-size: 2097152
basedir: build/tomcat
max-threads: 10
port-header: X-Forwarded-Port
protocol-header: X-Forwarded-Proto
protocol-header-https-value: https
remote-ip-header: X-FORWARDED-FOR
uri-encoding: UTF-8
accesslog:
enabled: true
pattern: "%t %a '%r' %s (%D ms)"
suffix: .log
session:
timeout: 300
cookie:
http-only: true
tracking-modes: COOKIE
context-parameters:
isLog4jAutoInitializationDisabled: true
cas:
server:
name: https://www.galsang.org:8443
prefix: https://www.galsang.org:8443/cas
adminPagesSecurity:
ip: 127.0.0.1
authn:
accept:
users: casuser::Mellon,admin::adminto # 静态用户信息
# webflow:
# crypto:
# enabled: false #cas.webflow.crypto.enabled=false
tgc:
secure: false # cas.tgc.secure=true
management:
security:
enabled: true
roles: ACTUATOR,ADMIN
sessions: if_required
context-path: /status
add-application-context-header: false
security:
basic:
enabled: false
authorize-mode: role
path: /cas/status/**
endpoints:
enabled: false
sensitive: true
restart:
enabled: false
shutdown:
enabled: false
logging:
config: classpath:log4j2.xml
info:
description: cas-server
Run(运行)
进入cas-server
模块执行 build run
命令。
sso-examples-guides\cas-server>build run
访问入口: https://127.0.0.1:8443/cas/login
默认的静态账户信息, 账号:casuser
, 密码: Mellon
或
使用我自定义的静态账户信息, 账号:admin
, 密码: adminto
至此,系统可以使用https
的形式进行访问,那么下面我们来看一下 Database Authentication
是如何配置实现的。
Database Authentication 配置
步骤一: 禁用静态账户
# 禁止静态认证
staticAuthentication: false
# 将将静态账户信息置空
cas:
authn:
accept:
users:
步骤二: 设计数据库
数据库脚本如下:
DROP DATABASE IF EXISTS `cas_dev`;
CREATE DATABASE `cas_dev` character Set UTF8;
use `cas_dev`;
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for `cas_user`
-- ----------------------------
DROP TABLE IF EXISTS `cas_user`;
CREATE TABLE `cas_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`password` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;
-- ----------------------------
-- Records of cas_user
-- ----------------------------
INSERT INTO `cas_user` VALUES ('1', 'admin', '1e1e262780021c6844af137175b56804');
步骤三: pom.xml
文件里增加依赖
<!--引入数据库认证相关 start-->
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-jdbc</artifactId>
<version>${cas.version}</version>
<exclusions>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
</exclusion>
<exclusion>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</exclusion>
<exclusion>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.driver.version}</version>
</dependency>
<!--引入数据库认证相关 end-->
步骤四: 在application.yml
中增加相关配置。
最终application.yml
内容为:
spring:
application:
name: cas-server
http:
encoding:
enabled: true
charset: UTF-8
force: true
thymeleaf:
encoding: UTF-8
cache: true
mode: HTML
aop:
auto: true
proxy-target-class: true
# CAS Server Context Configuration
server:
context-path: /cas
port: 8443
max-http-header-size: 2097152
use-forward-headers: true
connection-timeout: 20000
error:
include-stacktrace: ALWAYS
compression:
enabled: true
mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain
ssl:
key-store: classpath:sso.keystore
key-store-password: 123456
key-password: 123456
enabled: true
tomcat:
max-http-post-size: 2097152
basedir: build/tomcat
max-threads: 10
port-header: X-Forwarded-Port
protocol-header: X-Forwarded-Proto
protocol-header-https-value: https
remote-ip-header: X-FORWARDED-FOR
uri-encoding: UTF-8
accesslog:
enabled: true
pattern: "%t %a '%r' %s (%D ms)"
suffix: .log
session:
timeout: 300
cookie:
http-only: true
tracking-modes: COOKIE
context-parameters:
isLog4jAutoInitializationDisabled: true
cas:
server:
name: https://www.galsang.org:8443
prefix: https://www.galsang.org:8443/cas
adminPagesSecurity:
ip: 127.0.0.1
tgc:
secure: false # cas.tgc.secure=true
authn:
accept:
users: # 静态用户信息 casuser::Mellon,admin::adminto
jdbc:
query[0]:
sql: select * from cas_user where username=?
healthQuery: select 1
isolateInternalQueries: false
# 指定时区 serverTimezone=Asia/Shanghai
url: jdbc:mysql://127.0.0.1:3306/cas_dev?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
failFast: true
isolationLevelName: ISOLATION_READ_COMMITTED
dialect: org.hibernate.dialect.MySQLDialect
leakThreshold: 10
propagationBehaviorName: PROPAGATION_REQUIRED
batchSize: 1
user: root
password: adminto
autocommit: false
maxAgeDays: 180
driverClass: com.mysql.cj.jdbc.Driver
idleTimeout: 5000
fieldPassword: password
passwordEncoder:
type: DEFAULT
characterEncoding: UTF-8
encodingAlgorithm: MD5
staticAuthentication: false
management:
security:
enabled: true
roles: ACTUATOR,ADMIN
sessions: if_required
context-path: /status
add-application-context-header: false
security:
basic:
enabled: false
authorize-mode: role
path: /cas/status/**
endpoints:
enabled: false
sensitive: true
restart:
enabled: false
shutdown:
enabled: false
logging:
config: classpath:log4j2.xml
info:
description: cas-server
Run(运行)
进入cas-server
模块执行 build run
命令。
sso-examples-guides\cas-server>build run
访问入口: https://127.0.0.1:8443/cas/login
使用数据库中默认的账户信息, 账号:admin, 密码: adminto
密码修改可以在src/test/java
目录下的 PasswordByMD5Main
类进行重置密码,并更新到数据库即可。
至此,系统可以使用https
的形式进行访问,并通过 Database Authentication
进行用户认证。
Conclusions(结论)
- Database Authentication 使用的是
JPA
方式,数据库连接池使用的是HikariCP
JPA
是默认的 Database Authentication 方式,那么在后面的文章中将说明如何替换JPA
。
Recommendations(建议)
- 使用https
- 禁用静态账户
- 工程复杂,一定要注意版本之间的关系,开源项目,最好对照源码编译版本进行部署。
原创声明
作者:随风浮云
出处:http://www.cnblogs.com/ljmatlight
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明。
文中有不妥或者错误的地方,欢迎勘误,如果你有更好的建议,可以给我留言讨论,共同进步。
互联网技术时效性较强,引用请慎重。
CAS 之 Https And Database Authentication(三)的更多相关文章
- cas单点登录-jdbc认证(三)
前言 本节的内容为JDBC认证,查找数据库进行验证,其中包括: 密码加密策略(无密码,简单加密,加盐处理) 认证策略(jdbc) 一.业务需求 不同的公司,需求业务需求或者架构不一样导致我们实现验证的 ...
- 在阿里云 ECS 搭建 nginx https nodejs 环境(三、nodejs)
在阿里云 ECS 搭建 nginx https nodejs 环境(三.nodejs) 在阿里云 ECS 搭建 nginx https nodejs 环境(三.nodejs) 第一步 指定版本源 执行 ...
- ORA-38760: This database instance failed to turn on flashback database 第三篇
ORA-38760: This database instance failed to turn on flashback database 第三篇 第一篇 第二篇 问题现象: 在数据库a ...
- CAS进行https到http的改造方案,结合cookie源码分析
先说具体的改造方案: 服务端: 一.CAS Server端的修改 1.找到cas\WEB-INF\deployerConfigContext.xml 对以下Bean增加参数p:requireSecur ...
- CAS去掉HTTPS认证
如何去掉HTTPS认证? 说明:默认情况下HTTP也是可以访问CAS SERVER的,但认证,登陆,退出等操作均没有任何的效果.所以必须作出下面的修改 1.进入WEB-INF\spring-confi ...
- HTTPS那些事(三)攻击实例与防御(转载)
原创地址:http://www.guokr.com/blog/148613/ 在<HTTPS那些事(二)SSL证书>我描述了使用SSL证书时一些需要注意的安全问题,在这一篇文章里面我再 ...
- HTTPS和TCP协议三次握手设计
1. 我们的TCP 三次握手大概是长这样 2.那么为什么 TCP 要采取三次握手,而不是两次或其他 首先我们要知道握手的目的: 为了保证通讯双方建立的连接是可靠的. 同时,为了保证性能,握手的次数要求 ...
- https验证证书的三个级别
一.无条件信任证书 1. func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge ...
- HTTPS那些事(三)攻击实例与防御
在<HTTPS那些事(二)SSL证书>我描述了使用SSL证书时一些需要注意的安全问题,在这一篇文章里面我再演示一下针对HTTPS攻击的一些实例,通过这些实例能更安全的使用HTTPS.知己知 ...
随机推荐
- Linux 显示权限
Linux 显示权限 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ ls -lh 总用量 56K -rw-r--r-- 1 youhaidong youhai ...
- 学习笔记:webpack深入与实践(一)
一.webpack基本介绍 webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler). 四个核心概念: 入口(entry):指示 webpack 应该 ...
- myeclipse 打开jsp文件出错
第一步:找到MyEclipse的安装路径:第二步:删除掉MyEclipse\configuration下名为:org.eclipse.update的文件夹:第三步:产出之后重启myeclipse,在打 ...
- 1.17学习jquery权威指南
1.ajax方面(东西比较杂,很多相关于.net挂钩的服务器端接触没有实际操作,全部放进来,或许以后当作demo使用) ¥(“body”).load("text.txt"); ...
- 从IE浏览器获取当前页面的内容
从IE浏览器获取当前页面内容可能有多种方式,今天我所介绍的是其中一种方法.基本原理:当鼠标点击当前IE页面时,获取鼠标的坐标位置,根据鼠标位置获取当前页面的句柄,然后根据句柄,调用win32的东西进而 ...
- Linux中“is not in the sudoers file”解决方法
当在终端执行sudo命令时,系统提示"hadoop is not in the sudoers file": 其实就是没有权限进行sudo,解决方法如下(这里假设用户名是cuser ...
- C# Redis实战(三)
三.程序配置 在C# Redis实战(二)中我们安装好了Redis的系统服务,此时Redis服务已经运行. 现在我们需要让我们的程序能正确读取到Redis服务地址等一系列的配置信息,首先,需要在Web ...
- jmockito模拟方法中参数如何指定
在做单元测试的时候,经常会遇到mock类的方法的情景.在写单测过程中,遇到一些问题,比较困惑,便做了一些测试,并得出一个结论: 在mock类的方法时,当符合 (mock参数).equals(实际调用过 ...
- C#将.spl剥离成.emf文件格式
本文转载自 星战紫辉 http://www.cppblog.com/rawdata/archive/2009/02/23/74653.html 但C#代码实现为本人原创.https://github. ...
- MongoDB3.6之Replica Set初步体验
Replica Set在国内叫做副本集,简单来说就是一份数据在多个地方存储. 1.为什么要用副本集,什么时候使用副本集? 有人说一份数据在多个地方存储占用了大量的额外空间,是一种浪 ...