springboot security在标准的cas校验前另外加入新的校验方式,校验通过就跳过cas校验
时间: 2024-04-25 08:27:09 浏览: 133
可以通过实现`AuthenticationProvider`接口来实现新的校验方式。在`authenticate`方法里,可以在标准的CAS校验前加入自己的校验逻辑,如果校验通过,就返回一个`Authentication`对象,否则返回null。在配置`WebSecurityConfigurerAdapter`时,可以通过`authenticationProvider`方法将自定义的`AuthenticationProvider`添加到认证机制的提供者列表中,这样就可以在认证时使用自定义的校验方式。同时,可以通过配置`AuthenticationManagerBuilder`来实现校验通过后跳过CAS校验,具体可以参考Spring Security官方文档。
相关问题
提供完整的springboot security在标准的cas校验前另外加入新的校验方式,校验通过就跳过cas校验的demo代码
好的,以下是一个简单的示例代码,展示如何在 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 服务。
提供完整的实现springboot security在cas校验前另外加入新的校验方式,校验通过就跳过cas校验,没有通过才进入cas验证的demo代码
以下是一个基于Spring Boot和Spring Security的示例代码,它演示了如何在CAS认证之前添加自定义身份验证。
```java
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private CustomAuthenticationProvider customAuthenticationProvider;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/public/**").permitAll()
.antMatchers("/private/**").authenticated()
.and()
.apply(new CasAuthenticationConfigurer<>())
.casLoginUrl("https://your-cas-server.com/login")
.casService("https://your-app.com/login/cas")
.and()
.addFilterBefore(new CustomAuthenticationFilter(), CasAuthenticationFilter.class);
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(customAuthenticationProvider);
}
}
```
首先,我们需要创建一个自定义的身份验证提供者(CustomAuthenticationProvider),该提供者将执行我们的自定义身份验证逻辑。接下来,我们需要创建一个自定义的过滤器(CustomAuthenticationFilter),它将在CAS认证之前执行我们的自定义身份验证。
```java
public class CustomAuthenticationProvider implements AuthenticationProvider {
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
String username = authentication.getName();
String password = authentication.getCredentials().toString();
// 执行自定义身份验证逻辑
if (customAuthenticationSucceeds) {
List<GrantedAuthority> authorities = new ArrayList<>();
authorities.add(new SimpleGrantedAuthority("ROLE_USER"));
return new UsernamePasswordAuthenticationToken(username, password, authorities);
} else {
throw new BadCredentialsException("Custom authentication failed");
}
}
@Override
public boolean supports(Class<?> authentication) {
return authentication.equals(UsernamePasswordAuthenticationToken.class);
}
}
```
CustomAuthenticationFilter将在CAS认证之前执行我们的自定义身份验证逻辑。如果自定义身份验证通过,它将设置一个authenticated标志,并将身份验证对象保存在SecurityContext中。
```java
public class CustomAuthenticationFilter extends OncePerRequestFilter {
private static final String AUTHENTICATED_FLAG = "CUSTOM_AUTHENTICATED";
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
if (request.getAttribute(AUTHENTICATED_FLAG) != null) {
filterChain.doFilter(request, response);
return;
}
String username = request.getParameter("username");
String password = request.getParameter("password");
// 执行自定义身份验证逻辑
if (customAuthenticationSucceeds) {
request.setAttribute(AUTHENTICATED_FLAG, true);
Authentication authentication = new UsernamePasswordAuthenticationToken(username, password);
SecurityContextHolder.getContext().setAuthentication(authentication);
filterChain.doFilter(request, response);
} else {
response.sendRedirect("/login/cas");
}
}
}
```
最后,我们需要在SecurityConfig中添加CustomAuthenticationFilter,并将其放在CasAuthenticationFilter之前。
这样,当用户尝试访问需要身份验证的资源时,CustomAuthenticationFilter将首先执行自定义身份验证逻辑。如果自定义身份验证通过,用户将被授权并跳过CAS认证。否则,用户将被重定向到CAS登录页面。
阅读全文