Spring安全性仅允许访问具有特定用户名

时间:2017-07-16 12:34:06

标签: java spring spring-mvc spring-boot spring-security

我正在开发一个spring boot app并为用户编写API以便能够阅读消息。其中一个网址是:

/users/USER1/messages

现在,我显然希望只有经过身份验证的用户才能访问此get请求的内容。但是所有经过身份验证的用户都不够。我还希望只有拥有用户名的用户 - USER1才能在这里查看真实内容,其余应该收到403状态。我想出了如何在没有spring安全配置的情况下执行此操作(在我的服务中,我正在检查已登录的用户名并将其与URL中的参数进行比较,仅在它们相等时才继续),但我认为应该有更多使用SecurityConfiguration的简单方法?我目前的配置如下:

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers(HttpMethod.GET, "/users/**").authenticated()
            .antMatchers("/h2-console/*").permitAll()
                .anyRequest().authenticated()
            .and()
                .formLogin();

        http.csrf().disable();
        http.headers().frameOptions().disable();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("superman").password("superman").roles("USER")
                .and()
                .withUser("admin").password("admin").roles("ADMIN");
    }
}

编辑:以下答案提示方法安全表达式我已经使用它但它似乎仍然无法工作(如果我通过身份验证为USER2,我仍然可以读取USER1的消息)。这是我的控制器,我添加了PreAuthorize注释

@RequestMapping(method = RequestMethod.GET, value = "/messages", produces = {"application/json"})
@ResponseBody
@PreAuthorize("#userHandle == authentication.name")
public List<Message> getMessages(@PathVariable("userHandle") String userHandle,
                        @RequestParam(value="search", defaultValue="") String search) {
    //todo: change to return DTO not model
    return messageFacade.getMessages(userHandle, search);
}

EDIT2:在接受回答的评论中,@ EnableGlobalMethodSecurity(prePostEnabled = true)需要包含在安全配置中。一旦包含所有内容,一切正常。

1 个答案:

答案 0 :(得分:4)

我认为你需要Spring Method Security。文档中的示例几乎就是您的情况:

import org.springframework.data.repository.query.Param;

...

@PreAuthorize("#n == authentication.name")
Contact findContactByName(@Param("n") String name);

PS:别忘了@EnableGlobalMethodSecurity!查看教程here