URL-адреса авторизованной безопасности весной не входят в мой фильтр AbstractSecurityInterceptor - PullRequest
0 голосов
/ 17 мая 2018

Я просто использую Spring-Security для авторизации, ресурс URL зависит от ролей, связанных с пользователем, но мой вход в систему не зависит от Spring-Security.Но мои авторизованные URL-адреса не входят в мой JWTAuthenticationFilter, который используется для авторизации URL-адреса. Я не знаю, где проблема в моем коде, пожалуйста, ознакомьтесь с приведенным ниже кодом и укажите проблему в моей конфигурации или JWTAuthenticationFilter, который будет оченьполезно.Или любая ссылка ссылка также будет очень ценится.Большое вам спасибо!

мой файл конфигурации:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
                .authorizeRequests()
                .antMatchers(HttpMethod.POST,
                        "/user/login",
                        "/user/sso/login")
                .permitAll()
                .anyRequest().authenticated()
                .and()
                .authorizeRequests()
                .antMatchers(HttpMethod.GET,
                        "/pos/findAllList")
                .authenticated().and()
                .addFilterBefore(new JWTAuthenticationFilter(),
                        FilterSecurityInterceptor.class)
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    }

    @Override
    public void configure(WebSecurity web) throws Exception {
        super.configure(web);
        web
                .ignoring()
                .antMatchers("/admin/swagger/**");

    }

}

мой JWTAuthenticationFilter:

@Log4j2
public class JWTAuthenticationFilter extends AbstractSecurityInterceptor implements Filter{
    @Autowired
    private FilterInvocationSecurityMetadataSource securityMetadataSource;
    @Autowired
    private SmcAccessDecisionManager smcAccessDecisionManager;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        super.setAccessDecisionManager(smcAccessDecisionManager);
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        log.info("进入SmcSecurityFilter");
        FilterInvocation fi = new FilterInvocation( request, response, chain );
        invoke(fi);

    }

    public void invoke( FilterInvocation object ) throws IOException, ServletException{
        super.beforeInvocation(object);
        Collection<ConfigAttribute> attributes = securityMetadataSource.getAttributes(object);
        this.smcAccessDecisionManager.decide(SecurityContextHolder.getContext().getAuthentication(), object, attributes);
        InterceptorStatusToken token = super.beforeInvocation(object);
        try{
            object.getChain().doFilter(object.getRequest(), object.getResponse());
        }finally{
            super.afterInvocation(token, null);
        }

    }

    public FilterInvocationSecurityMetadataSource getSecurityMetadataSource(){
        return this.securityMetadataSource;
    }

    public void setSecurityMetadataSource(FilterInvocationSecurityMetadataSource securityMetadataSource) {
        this.securityMetadataSource = securityMetadataSource;
    }

    @Override
    public void destroy() {

    }

    @Override
    public Class<?> getSecureObjectClass() {
        return FilterInvocation.class;
    }

    @Override
    public SecurityMetadataSource obtainSecurityMetadataSource() {
        return this.securityMetadataSource;
    }
}

1 Ответ

0 голосов
/ 17 мая 2018

Попробуйте изменить doFilter (), чтобы он выглядел так:

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    log.info("进入SmcSecurityFilter");
    FilterInvocation fi = new FilterInvocation( request, response, chain );
    invoke(fi, chain, request, response);
}

И ваш метод invoke () такой:

  public void invoke(FilterInvocation object,  FilterChain chain, ServletRequest request, ServletResponse response) throws IOException, ServletException{
    super.beforeInvocation(object);
    Collection<ConfigAttribute> attributes = securityMetadataSource.getAttributes(object);
    this.smcAccessDecisionManager.decide(SecurityContextHolder.getContext().getAuthentication(), object, attributes);
    InterceptorStatusToken token = super.beforeInvocation(object);
    try{
        chain.doFilter(request, response);
    }finally{
        super.afterInvocation(token, null);
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...