首先你需要自定义一个类,当然需要继承extends WebSecurityConfigurerAdapter类用@Configuration(声明这个类是配置文件)和@EnableWebSecurity(开启security安全声明)和@EnableGlobalMethodSecurity(prePostEnabled = true)(可以直接在controller的方法上声明注解,可以进行角色拦截)
然后重写configure(HttpSecurity http)的方法,这里面来自定义自己的拦截方法和业务逻辑。
security的大致过程是这样的。首先过滤器filter先拦截,然后调用mannger中的Provider来处理,设置统一信息返回处理让EntryPoint来处理返回请求。这里的类都需要自定义。并且在configure方法上声明才可以使用。
注意:只有filter类方法getPreAuthenticatedPrincipal不返回null才会走到provide中,如果不为null,则走到provide类的supports方法中,返回的布尔类型,如果为true,则走authenticate这个方法。为false则不走,出错的话走EntryPoint类,否则走controller里面对应的api
需要继承AbstractPreAuthenticatedProcessingFilter类和实现两个方法
public class RestPreAuthenticatedProcessingFilter extends AbstractPreAuthenticatedProcessingFilter{
@Override
protected Object getPreAuthenticatedPrincipal(HttpServletRequest request) {
return null;
}
@Override
protected Object getPreAuthenticatedCredentials(HttpServletRequest httpServletRequest) {
return null;
}
}
自定义provide
需要继承AuthenticationProvider和实现两个方法
public class RestAuthenticationProvider implements AuthenticationProvider{
@Override
public Authentication authenticate(Authentication authentication){
}
@Override
public boolean supports(Class<?> authentication) {
}
}
设置统一信息返回处理类
需要继承AuthenticationEntryPoint,重写一个方法
public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint{
@Override
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException e){
}
}
自定义过后还需要在configure方法中声明。有几个需要注意的地方
声明过滤器,因为过滤器需要一个Manager,所以要指定一个Manager。
并且Manager也需要指定里面的provide,因为是provide来处理逻辑的
所以config方法应该这样写
/**
* 为验证拦截器设置AuthenticationManager (由于用了springboot注入方式)
* @return
* @throws Exception
*/
private RestPreAuthenticatedProcessingFilter getPreAuthenticatedProcessingFilter() throws Exception {
RestPreAuthenticatedProcessingFilter filter = new RestPreAuthenticatedProcessingFilter(parameters.getNoneSecurityPath(),commonCacheUtil);
filter.setAuthenticationManager(this.authenticationManagerBean());
return filter;
}
//指定provider
@Override
protected void configure(AuthenticationManagerBuilder auth)
throws Exception {
auth.authenticationProvider(new RestAuthenticationProvider());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers(parameters.getNoneSecurityPath().toArray(new String[parameters.getNoneSecurityPath().size()])).permitAll()//符合条件的路径放过验证
// .anyRequest().hasRole("BIKE_CLIENT")//其他全部需要 BIKE_CLIENT 角色
.anyRequest().authenticated()//其他全部需要授权
.and().httpBasic().authenticationEntryPoint(new RestAuthenticationEntryPoint())//设置统一信息返回处理
.and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)//无状态请求 不需要session
.and()
.addFilter(getPreAuthenticatedProcessingFilter())//添加自定义登录验证过滤器
;
}