Java 如何在spring security中添加授权过滤器来验证令牌并设置安全上下文?
我有一个使用SpringSecurity4的SpringMVC应用程序,我想在请求中添加基于jwt令牌的授权。在过滤器中我需要做的是Java 如何在spring security中添加授权过滤器来验证令牌并设置安全上下文?,java,spring,spring-mvc,spring-security,jwt,Java,Spring,Spring Mvc,Spring Security,Jwt,我有一个使用SpringSecurity4的SpringMVC应用程序,我想在请求中添加基于jwt令牌的授权。在过滤器中我需要做的是 从请求头获取令牌 将令牌发送到外部API并获取用户详细信息 在安全上下文中设置获取的详细信息 但是当我启动应用程序时,会出现一个错误,提示需要一个AuthenticationManager。我不确定UserDetails服务如何应用于我的用例。因此,我为测试添加了一个虚拟返回值,因为如果没有UserDetailsService应用程序,它将无法工作。有什么想法吗
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(
prePostEnabled = true
)
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
@Qualifier("applicationUserService")
UserDetailsService userDetailsService;
@Override
public void configure(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception {
SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL);
authenticationManagerBuilder
.userDetailsService(userDetailsService)
.passwordEncoder(bCryptPasswordEncoder());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable().authorizeRequests()
.antMatchers(HttpMethod.GET, "/home").hasAnyRole("ADMIN")
.antMatchers(HttpMethod.GET, "/login").hasAnyRole("ADMIN")
.anyRequest().authenticated()
.and()
.addFilter(new AuthorizationFilter(authenticationManager()))
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}
@Bean
public BCryptPasswordEncoder bCryptPasswordEncoder() {
return new BCryptPasswordEncoder();
}
授权筛选器类
public class AuthorizationFilter extends BasicAuthenticationFilter {
private static final Logger LOGGER = LoggerFactory.getLogger(AuthorizationFilter.class);
public AuthorizationFilter(AuthenticationManager authenticationManager) {
super(authenticationManager);
}
@Override
protected void doFilterInternal(HttpServletRequest req, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
LOGGER.info("Request Info : {}", req.getRequestURI());
// get token
// fetch details from external API
// set security context
List<GrantedAuthority> authorities = new ArrayList<>();
authorities.add((GrantedAuthority) () -> "ROLE_ADMIN");
SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken("user1", null, authorities));
LOGGER.info("security context principle:{}", SecurityContextHolder.getContext().getAuthentication().getPrincipal().toString());
LOGGER.info("authorities context:{}", SecurityContextHolder.getContext().getAuthentication().getAuthorities().toString());
chain.doFilter(req, response);
}
尝试以下步骤
AbstractAuthenticationProcessingFilter
来评估请求和返回令牌
公共类AwesomeFilter扩展了AbstractAuthenticationProcessingFilter{
公共授权筛选器(){
超级(新的AntPathRequestMatcher(“/your_post_url”,“post”));
}
@凌驾
公共身份验证尝试身份验证(HttpServletRequest请求、HttpServletResponse响应){
//评估请求。。。
//使用此信息构建自定义身份验证令牌
AwesomeToken token=新的AwesomeToken();
//使用身份验证管理器对令牌进行身份验证
返回getAuthenticationManager().Authentication(令牌);
}
AuthenticationProvider
来支持您的AwesomeToken
。Spring Security将尝试“支持”这一点public类AwesomeProvider实现AuthenticationProvider{
@凌驾
公共身份验证(身份验证)引发AuthenticationException{
//评估您的自定义令牌
//调用API等
//使用权限生成用户身份验证令牌详细信息
收集尝试以下步骤
定义一个AbstractAuthenticationProcessingFilter
来评估请求和返回令牌
公共类AwesomeFilter扩展了AbstractAuthenticationProcessingFilter{
公共授权筛选器(){
超级(新的AntPathRequestMatcher(“/your_post_url”,“post”));
}
@凌驾
公共身份验证尝试身份验证(HttpServletRequest请求、HttpServletResponse响应){
//评估请求。。。
//使用此信息构建自定义身份验证令牌
AwesomeToken token=新的AwesomeToken();
//使用身份验证管理器对令牌进行身份验证
返回getAuthenticationManager().Authentication(令牌);
}
定义一个AuthenticationProvider
来支持您的AwesomeToken
。Spring Security将尝试“支持”这一点
public类AwesomeProvider实现AuthenticationProvider{
@凌驾
公共身份验证(身份验证)引发AuthenticationException{
//评估您的自定义令牌
//调用API等
//使用权限生成用户身份验证令牌详细信息
收集
@Service
@Qualifier("applicationUserService")
public class ApplicationUserServiceImpl implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
return new User("sidath", "123", emptyList());
}
}