简体   繁体   English

PermitAll 在 Spring Security 中不起作用

[英]PermitAll not working in Spring Security

I have two rules, the first one every url from oauth/** should be without security and and other url have to security.我有两个规则,第一个来自 oauth/** 的每个 url 应该没有安全性,而其他 url 必须安全。 But now all urls are secure include url from oauth/**.但是现在所有的 url 都是安全的,包括来自 oauth/** 的 url。 This is my security config rule.这是我的安全配置规则。

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        // JWT dont need CSRF
        httpSecurity.csrf().disable().exceptionHandling().and().sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS).and().authorizeRequests()
                .antMatchers("oauth/**").permitAll().and()
                .addFilterBefore(new JwtAuthenticationTokenFilter(), BasicAuthenticationFilter.class);

        // disable page caching
        httpSecurity.headers().cacheControl();
    }

}

when I request the url http://localhost:8080/oauth/fb that is enter my JwtAuthenticationTokenFilter, and I want this url don't enter this filter.当我请求输入我的 JwtAuthenticationTokenFilter 的 url http://localhost:8080/oauth/fb 时,我希望这个 url 不要输入这个过滤器。

You can override configure method with WebSecurity parameter.您可以使用 WebSecurity 参数覆盖配置方法。

@Override
public void configure(final WebSecurity web) throws Exception
{
    web.ignoring().antMatchers("oauth/**");
}

This method should be used when serving static content such as css/* js/*, suggested in the documentation, however I couldn't find another way to permit URL mapping with custom filter in Spring Security.在提供文档中建议的 css/* js/* 等静态内容时应使用此方法,但是我找不到另一种方法来允许使用 Spring Security 中的自定义过滤器进行 URL 映射。

<security:http pattern="/support/**" security="none"/>

You would probably need to write the Java equivalent of the above XML configuration.您可能需要编写与上述 XML 配置等效的 Java。 Basically, you are setting a new filter chain with no security for the above pattern.基本上,您正在为上述模式设置一个没有安全性的新过滤器链。

I faced a similar problem.我遇到了类似的问题。 My security config:我的安全配置:

// ... imports
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    private final UserDetailsService userDetailsService;
    private final PasswordEncoder passwordEncoder;
    private final JwtFilter jwtFilter;

    @Autowired
    public SecurityConfig(@Qualifier("userDetailsServiceImpl") UserDetailsService userDetailsService,
                          PasswordEncoder passwordEncoder,
                          JwtFilter jwtFilter) {
        this.userDetailsService = userDetailsService;
        this.passwordEncoder = passwordEncoder;
        this.jwtFilter = jwtFilter;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .csrf().disable()
                .httpBasic().disable()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .authorizeRequests()
                .antMatchers(HttpMethod.POST, "/auth/**").permitAll()
                .and()
                .authorizeRequests()
                .anyRequest().authenticated()
                .and()
                .addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class);
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(daoAuthenticationProvider());
    }

    protected DaoAuthenticationProvider daoAuthenticationProvider() {
        DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
        provider.setUserDetailsService(userDetailsService);
        provider.setPasswordEncoder(passwordEncoder);
        return provider;
    }
}

And my security filter:还有我的安全过滤器:

// ... imports
@Component
public class JwtFilter extends GenericFilterBean {
    public static final String AUTHORIZATION_HEADER = "Authorization";
    public static final String TOKEN_PREFIX = "Bearer ";
    public static final int TOKEN_START_POSITION = 7;

    private final JwtProvider jwtProvider;

    @Autowired
    public JwtFilter(JwtProvider jwtProvider) {
        this.jwtProvider = jwtProvider;
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
            throws IOException, ServletException {
        String token = getTokenFromRequest((HttpServletRequest) servletRequest);
        if (token != null && jwtProvider.validateToken(token)) {
            Map<String, Object> properties = jwtProvider.getUserPropertiesFromToken(token);
            UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(
                    properties.get("login"),
                    null,
                    (Set<GrantedAuthority>) properties.get("authirities"));
            SecurityContextHolder.getContext().setAuthentication(auth);
        }
        filterChain.doFilter(servletRequest, servletResponse);
    }

    private String getTokenFromRequest(HttpServletRequest request) {
        String bearer = request.getHeader(AUTHORIZATION_HEADER);
        if (bearer != null && bearer.startsWith(TOKEN_PREFIX)) {
            return bearer.substring(TOKEN_START_POSITION);
        }
        return null;
    }
}

The reason my code didn't work for me was that I skipped the line filterChain.doFilter(servletRequest, servletResponse);我的代码对我不起作用的原因是我跳过了filterChain.doFilter(servletRequest, servletResponse); in my filter, ie I didn't pass on the request and response to the next entity in the chain.在我的过滤器中,即我没有将请求和响应传递给链中的下一个实体。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 春季安全许可证全部不起作用 - spring security permitAll not working 带有过滤器许可的Spring Security全部不起作用 - Spring Security with filters permitAll not working Spring MVC安全性permitAll / /但拒绝所有/ / **不起作用 - Spring MVC Security permitAll to / but denyAll to /** not working H2 控制台和 Spring Security - permitAll() 不起作用 - H2 console and Spring Security - permitAll() not working Spring Boot 3 安全 requestMatchers.permitAll 不工作 - Spring Boot 3 Security requestMatchers.permitAll not working 春季安全性:authorizeRequests()。antMatchers()。permitAll()不起作用 - Spring Security: authorizeRequests().antMatchers().permitAll() is not working 配置中的 Spring Security hasRole(&#39;ROLE_ADMIN&#39;) 和 @PreAuthorize(&quot;permitAll&quot;) 不起作用? - Spring Security hasRole('ROLE_ADMIN') in config and @PreAuthorize("permitAll") not working? 为什么Spring Security permitAll()无法与OAuth2.0一起使用? - Why Spring Security permitAll() is not working with OAuth2.0? 一起使用denyAll()和permitAll()Spring Security 3.0.8无法正常工作 - Using denyAll() and permitAll() together Spring security 3.0.8 not working 带有permitAll()和过期身份验证令牌的URL的Spring Security - Spring Security for URL with permitAll() and expired Auth Token
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM