提供完整的springboot security在标准的cas校验前另外加入新的校验方式,校验通过就跳过cas校验的demo代码
时间: 2024-03-15 13:47:01 浏览: 198
好的,以下是一个简单的示例代码,展示如何在 Spring Boot Security 中添加新的身份验证机制,并在标准 CAS 验证之前进行身份验证。如果新的身份验证成功,则跳过 CAS 验证。
```java
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private CustomAuthenticationProvider customAuthProvider;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/login").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/home")
.permitAll()
.and()
.logout()
.logoutSuccessUrl("/login")
.permitAll();
http.authenticationProvider(customAuthProvider)
.addFilterBefore(customAuthFilter(), UsernamePasswordAuthenticationFilter.class)
.addFilterBefore(new CasAuthenticationFilter(casAuthenticationProvider()), CasAuthenticationFilter.class);
}
@Bean
public CustomAuthFilter customAuthFilter() throws Exception {
CustomAuthFilter customAuthFilter = new CustomAuthFilter();
customAuthFilter.setAuthenticationManager(authenticationManager());
return customAuthFilter;
}
@Bean
public AuthenticationProvider casAuthenticationProvider() {
CasAuthenticationProvider casAuthProvider = new CasAuthenticationProvider();
casAuthProvider.setAuthenticationUserDetailsService(casUserDetailsService());
casAuthProvider.setServiceProperties(serviceProperties());
casAuthProvider.setTicketValidator(new Cas30ServiceTicketValidator(casServerUrl()));
casAuthProvider.setKey("CAS_PROVIDER_LOCALHOST_8888");
return casAuthProvider;
}
@Bean
public UserDetailsByNameServiceWrapper<CasAssertionAuthenticationToken> casUserDetailsService() {
return new UserDetailsByNameServiceWrapper<>(userDetailsService());
}
@Bean
public ServiceProperties serviceProperties() {
ServiceProperties sp = new ServiceProperties();
sp.setService(serviceUrl());
sp.setSendRenew(false);
return sp;
}
@Bean
public String casServerUrl() {
return "https://localhost:8443/cas";
}
@Bean
public String serviceUrl() {
return "https://localhost:8888/login/cas";
}
}
```
在上面的代码中,我们首先创建了一个自定义的身份验证提供者 CustomAuthenticationProvider,并将其注入到 Security 配置中。然后,我们在 configure() 方法中添加了一个新的自定义身份验证过滤器 CustomAuthFilter,并将其添加到 UsernamePasswordAuthenticationFilter 之前。
接下来,我们将 CAS 身份验证过滤器添加到 Security 配置中。请注意,我们将它放在自定义身份验证过滤器的后面。这样一来,如果自定义身份验证过滤器成功验证了用户身份,就会跳过 CAS 身份验证过滤器。如果自定义身份验证过滤器无法验证用户身份,则会将请求传递给 CAS 身份验证过滤器进行处理。
最后,我们创建了一个 CasAuthenticationProvider,并将其添加到 Security 配置中。这个 CasAuthenticationProvider 将使用 Cas30ServiceTicketValidator 来验证 CAS 服务票据,并将验证结果转换为一个身份验证对象 CasAssertionAuthenticationToken。然后,我们将 UserDetailsByNameServiceWrapper 与 CasAssertionAuthenticationToken 关联起来,以便可以获取用户详细信息。最后,我们还创建了 ServiceProperties 对象和两个 URL,用于配置 CAS 服务。
阅读全文