下面为你讲解“Spring Boot整合CAS配置详解”。
1. 前置知识
在开始讲解之前需要了解的几个概念:
- CAS(Central Authentication Service,中心认证服务):是 Yale 大学发起的一个企业级的、开源的、单点登录系统。
- Spring Boot:是一个基于 Spring 框架实现的、简化了配置的快速开发框架。
- Thymeleaf:是一款服务端 Java 模板引擎。与 JSP 相比,它更加简洁易懂,并且语法更加简单。
2. CAS Server的搭建
首先需要搭建一个 CAS Server 作为认证中心。在这里就不详细讲解了。如果您还没有搭建过可以参考官方文档进行搭建。
3. Spring Boot整合CAS的配置
3.1 添加依赖
在pom.xml文件中添加以下依赖:
<!-- Spring Boot CAS Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-spring-boot-starter-actuator</artifactId>
<version>${cas.version}</version>
</dependency>
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-validation-api</artifactId>
<version>${cas.version}</version>
</dependency>
<dependency>
<groupId>de.otto</groupId>
<artifactId>java-diff-utils</artifactId>
<version>3.2.0</version>
</dependency>
其中${cas.version}为CAS Server的版本号。
3.2 配置application.yml
在application.yml中添加以下配置:
spring:
security:
saml2:
metadata:
file-system:
path: classpath:/saml2/service-provider-metadata.xml
relying-party:
registration:
cas-saml:
entity-id: __ENTITY_ID__
identity-provider-url: __IDP_URL__
signing-key-location: /etc/cas/thekeystore
verification-keys: cas-saml-sp-key
cas:
server:
prefix: https://localhost:8443/cas/
login-url: https://localhost:8443/cas/login
logout-url: https://localhost:8443/cas/logout
sso-enabled: true
protocol: SAML
authn:
saml:
idp:
metadata:
url: https://localhost:8443/cas/idp/metadata
callback-url: /login/cas
management:
security:
enabled: false
其中:
- saml2.metadata.file-system.path:SAML元数据的位置,这里指定为classpath路径下的service-provider-metadata.xml。
- saml2.relying-party.registration.cas-saml.entity-id:实体ID。
- saml2.relying-party.registration.cas-saml.identity-provider-url:SAML认证中心的地址。
- saml2.relying-party.registration.cas-saml.signing-key-location:证书存放的位置。
- saml2.relying-party.registration.cas-saml.verification-keys:证书别名。
- cas.server.prefix:CAS Server的地址。
- cas.server.login-url:CAS Server登录页面的地址。
- cas.server.logout-url:CAS Server登出的地址。
- cas.server.sso-enabled:是否启用单点登录。
- cas.server.protocol:采用的协议,这里选用SAML。
- cas.server.authn.saml.idp.metadata.url:SAML认证中心的元数据URL地址。
- cas.server.authn.saml.callback-url:CAS Server登录后的回调地址。
- cas.management.security.enabled:管理端的安全开关。
3.3 编写代码
在代码中添加以下配置:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends CasWebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
http.antMatcher("/**")
.authorizeRequests()
.antMatchers("/").permitAll()
.anyRequest().authenticated();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(casAuthenticationProvider());
}
@Bean
public CasAuthenticationProvider casAuthenticationProvider() {
CasAuthenticationProvider casAuthenticationProvider = new CasAuthenticationProvider();
casAuthenticationProvider.setUserDetailsService(userDetailsService());
casAuthenticationProvider.setServiceProperties(serviceProperties());
casAuthenticationProvider.setTicketValidator(cas30ServiceTicketValidator());
casAuthenticationProvider.setKey("casAuthenticationProviderKey");
return casAuthenticationProvider;
}
@Bean
public ServiceProperties serviceProperties() {
ServiceProperties serviceProperties = new ServiceProperties();
serviceProperties.setService("http://localhost:8080/");
serviceProperties.setSendRenew(false);
return serviceProperties;
}
@Bean
public Cas30ServiceTicketValidator cas30ServiceTicketValidator() {
return new Cas30ServiceTicketValidator("https://localhost:8443/cas");
}
@Bean
public DefaultWebSecurityExpressionHandler defaultWebSecurityExpressionHandler(){
return new DefaultWebSecurityExpressionHandler();
}
@Override
@Bean
public AuthenticationManager authenticationManager() throws Exception {
CasAuthenticationProvider casAuthenticationProvider = casAuthenticationProvider();
return new ProviderManager(Arrays.asList(casAuthenticationProvider));
}
}
其中:
- configure(HttpSecurity http):配置访问控制规则。
- configure(AuthenticationManagerBuilder auth):配置认证方式。
- casAuthenticationProvider():返回一个CasAuthenticationProvider对象,指定CAS的认证方式。
- serviceProperties():设置服务属性。
- cas30ServiceTicketValidator():使用CAS3.0协议进行认证。
- authenticationManager():返回一个AuthenticationManager对象。
3.4 验证
在浏览器中访问http://localhost:8080/,将会跳转到CAS Server的登录页面。输入用户名和密码以后,将会自动跳转回到应用页面。
4. 示例
4.1 示例1:基于Thymeleaf的模板应用
在application.yml中添加以下配置:
spring:
thymeleaf:
mode: HTML
在HomeController中添加以下代码:
@Controller
public class HomeController {
@GetMapping("/")
public String index(Model model) {
model.addAttribute("auth", SecurityContextHolder.getContext().getAuthentication());
return "index";
}
}
在src/main/resources/templates目录下创建index.html文件,添加以下代码:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Index</title>
</head>
<body>
<h1>Index</h1>
<p>您好,[[${auth.name}]]</p>
<p><a href="/logout">退出登录</a></p>
</body>
</html>
以上代码会根据当前用户是否已经登录,来动态显示"Hello, [username]"或"Please login"。
4.2 示例2:基于Spring Security的RESTful应用
在Controller中添加以下代码:
@RestController
public class TestController {
@GetMapping("/test")
@PreAuthorize("isAuthenticated()")
public String test() {
return "Hello World!";
}
}
以上代码会根据当前用户是否已经登录,来返回"Hello World!"或返回403 Forbidden。
5. 总结
本篇文章详细介绍了Spring Boot整合CAS的过程,并且给出了两个示例。在实际开发中,可以根据需要选择适合的示例进行参考。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:spring boot整合CAS配置详解 - Python技术站