基于 Java 注解的 Spring 安全配置

Posted

技术标签:

【中文标题】基于 Java 注解的 Spring 安全配置【英文标题】:Java annotation based Spring security config 【发布时间】:2018-02-13 06:19:16 【问题描述】:

我尝试基于 Spring security 配置进行 Java 注释。我在遵循教程并提供了代码后执行此操作,

@Configuration
@EnableWebSecurity
// need to change this to the security directory
@ComponentScan("")
public class SecurityConfig extends WebSecurityConfigurerAdapter 

    @Autowired
    private RestAuthenticationEntryPoint restAuthenticationEntryPoint;

    @Autowired
    private MySavedRequestAwareAuthenticationSuccessHandler authenticationSuccessHandler;

    @Override
    protected void configure(AuthenticationManagerBuilder auth)
            throws Exception 

        auth.inMemoryAuthentication()
                .withUser("temporary").password("temporary").roles("ADMIN")
                .and()
                .withUser("user").password("userPass").roles("USER");
    

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http
                .csrf().disable()
                .exceptionHandling()
                .authenticationEntryPoint(restAuthenticationEntryPoint)
                .and()
                .authorizeRequests()
                .antMatchers("/api/foos").authenticated()
                .and()
                .formLogin()
                .successHandler(authenticationSuccessHandler)
                .failureHandler(new SimpleUrlAuthenticationFailureHandler())
                .and()
                .logout();
    

    @Bean
    public MySavedRequestAwareAuthenticationSuccessHandler mySuccessHandler() 
        return new MySavedRequestAwareAuthenticationSuccessHandler();
    

    @Bean
    public SimpleUrlAuthenticationFailureHandler myFailureHandler() 
        return new SimpleUrlAuthenticationFailureHandler();
    

我工作的项目的API 基地,

public static final String API_BASE = "/*";

例如,我执行cURL 之类的请求,

curl -X GET http://localhost:8080/rest/wallet/wallets | json

我不确定代码中的 .antMatchers("/api/foos").authenticated() 行。例如,foos 来自哪里,我是否需要将其更改为 .antMatchers("/foos").authenticated()

【问题讨论】:

【参考方案1】:

如果您是编程新手,这是一个有效的问题。不过习惯就好。所有示例通常都会有 'foo' 和 'bar' 作为示例变量、方法名称等。

无论如何,.antMatchers("/api/foos").authenticated() 指定匹配 /api/foo 的模式 URL 需要经过身份验证,然后应该使用以下处理程序。

将模式更改为您的匹配模式 - .antMatchers("/rest/wallet/**") 并测试您的代码。

更多参考 - 阅读这篇文章:When to use Spring Security`s antMatcher()?

【讨论】:

所以我有@Path("rest/wallet")@Path("rest/service")@Path("rest/user") 之类的路径,并且我使用了.antMatchers("rest/wallet/**").authenticated() .antMatchers("rest/user/**").authenticated() .antMatchers("rest/service/**").authenticated() 之类的匹配项。现在正确吗?告诉我,我会接受你的回答。 对我来说似乎很好。只需使用 / 像 /rest/wallet 开始 URL 上下文路径(考虑在类顶部有根路径 @Path("/rest"),这样您就不必一直重复根上下文)。我只是给了你在哪里看的上下文。探索更多并继续前进。你被卡住的越多,你学到的就越多。 :) 编程确实如此,有时你只是感觉不到推动更多的能量:)

以上是关于基于 Java 注解的 Spring 安全配置的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot + session + 注解 实现简单的安全验证和权限管理(一)

登录 Spring 安全重定向到错误 Thymeleaf 和基于 Java 的配置

基于javaConfig和注解配置Spring Security

基于注解的Spring AOP的配置和使用--转载

基于注解的Spring AOP的配置和使用--转载

基于注解的Spring AOP的配置和使用--转载