一、安装配置CAS Server
- 下载CAS Server
从官方网站(https://apereo.github.io/cas/)下载最新版CAS Server。
- 配置CAS Server
使用maven编译cas-server-webapp,并将war文件部署到Tomcat或Jetty中。
对于CAS Server的配置,主要需要进行以下修改:
(1) 修改cas.properties
在cas.properties文件中,需要将cas.server.name和cas.server.prefix修改为实际的域名和CAS Server的上下文路径。
(2) 修改deployerConfigContext.xml
在deployerConfigContext.xml文件中,主要需要修改的是serviceRegistry配置,我们这里使用JDBC实现。
二、Springboot项目集成CAS Client
- 引入CAS Client依赖
在pom.xml文件中,添加以下依赖:
<dependency>
<groupId>org.jasig.cas.client</groupId>
<artifactId>cas-client-core</artifactId>
<version>3.6.0</version>
</dependency>
- 配置CAS Client
在application.properties中添加以下配置:
cas.server.url=https://cas.example.com/cas/
cas.server.login.url=https://cas.example.com/cas/login
cas.server.logout.url=https://cas.example.com/cas/logout
cas.client.serviceUrl=https://my-app.example.com/login/cas
其中,cas.server.url配置为CAS Server的地址,cas.client.serviceUrl为我们的应用地址。
- 配置Security
在Spring Security的配置类中,添加以下配置:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/login/cas").authenticated()
.anyRequest().permitAll()
.and()
.apply(new CasAuthenticationConfigurer<>());
}
@Bean
public AuthenticationEntryPoint authenticationEntryPoint() {
CasAuthenticationEntryPoint entryPoint = new CasAuthenticationEntryPoint();
entryPoint.setLoginUrl("https://cas.example.com/cas/login");
entryPoint.setServiceProperties(serviceProperties());
return entryPoint;
}
@Bean
public CasAuthenticationProvider casAuthenticationProvider() {
CasAuthenticationProvider provider = new CasAuthenticationProvider();
provider.setAuthenticationUserDetailsService(authenticationUserDetailsService());
provider.setServiceProperties(serviceProperties());
provider.setTicketValidator(new Cas20ServiceTicketValidator("https://cas.example.com/cas"));
provider.setKey("my-cas-key");
return provider;
}
@Bean
public AuthenticationUserDetailsService<CasAssertionAuthenticationToken> authenticationUserDetailsService() {
return new UserDetailsServiceImpl();
}
@Bean
public ServiceProperties serviceProperties() {
ServiceProperties serviceProperties = new ServiceProperties();
serviceProperties.setService("https://my-app.example.com/login/cas");
serviceProperties.setSendRenew(false);
return serviceProperties;
}
}
上述配置实现了:
(1) /login/cas接口需要认证
(2) 认证失败时,自动跳转到CAS Server登录界面
(3) 配置了CAS认证提供者
(4) 配置了认证的用户信息来源
(5) 设置了CAS认证的Key
(6) 设置了ServiceProperties
在上述配置中,我们需要定义一个UserDetailsServiceImpl类作为CAS认证提供者的用户信息来源。
@Service
public class UserDetailsServiceImpl implements AuthenticationUserDetailsService<CasAssertionAuthenticationToken> {
@Autowired
private UserService userService;
@Override
public UserDetails loadUserDetails(CasAssertionAuthenticationToken token) throws UsernameNotFoundException {
String username = token.getName();
User user = userService.getUserByUsername(username);
if (user == null) {
throw new UsernameNotFoundException(username);
}
return new UserPrincipal(user);
}
}
其中,getUserByUsername方法是我们自己实现的方法,用于根据用户名查询用户信息。
三、引入Spring Security的@EnableGlobalMethodSecurity注解
最后,在SpringBoot应用的启动类上使用@EnableGlobalMethodSecurity注解启用Spring Security的方法级别鉴权。
@SpringBootApplication
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
示例一:使用CAS实现单点登录
配置好上述内容后,我们启动CAS Server和我们的应用MyApplication,然后访问https://my-app.example.com/login/cas,会自动跳转至CAS Server的登录页面,在CAS Server进行登录后,会自动跳转回我们的应用,并获得登录后的用户信息。
示例二:使用Spring Security实现权限管理
在SecurityConfig中,我们使用了Spring Security进行认证和授权,我们可以进一步使用@PreAuthorize和@PostAuthorize注解实现方法级别的鉴权。
例如,我们定义如下方法:
@RestController
@RequestMapping("/api")
public class MyController {
@PreAuthorize("hasRole('ROLE_ADMIN')")
@GetMapping("/admin")
public String showAdminPage() {
return "Hello, admin!";
}
@PreAuthorize("hasRole('ROLE_USER') && #username == principal.username")
@GetMapping("/user/{username}")
public String showUserPage(@PathVariable String username) {
return "Hello, " + username + "!";
}
}
在上述代码中,showAdminPage方法只有拥有ROLE_ADMIN角色的用户才能访问,showUserPage方法只有拥有ROLE_USER角色并且路径参数中的username与当前登录用户的用户名相同的用户才能访问。
当用户访问需要权限的接口时,如果未具有足够的权限,则会自动跳转到Spring Security的默认错误页面。
至此,我们成功地将CAS集成到了我们的Spring Boot应用中,并使用Spring Security实现了权限管理。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring boot security权限管理集成cas单点登录功能的实现 - Python技术站