【发布时间】:2015-05-30 07:37:27
【问题描述】:
我做了很多研究,在我看来一切都正确......但我无法让它发挥作用!有人知道吗?
无论我做什么,相关映射对任何人都是公开的(匿名或登录,无论他们拥有什么角色)。
理想情况下,我希望所有请求都是公开的,除了那些由 @Secured() 注释的请求 - 显然只有具有特定角色的用户才能访问这些映射。
这可能吗?
仅供参考,作为一种解决方法,我目前构建了一个方法“hasRole(String role)”,它检查登录用户的角色,如果该方法返回 false,则抛出 NotAuthorizedException(自定义)。
用户详情
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
List<GrantedAuthority> grantedAuthorities = null;
System.out.print("Account role... ");
System.out.println(account.getRole());
if (account.getRole().equals("USER")) {
GrantedAuthority grantedAuthority = new SimpleGrantedAuthority("ROLE_USER");
grantedAuthorities = Arrays.asList(grantedAuthority);
}
if (account.getRole().equals("ADMIN")) {
GrantedAuthority grantedAuthorityUser = new SimpleGrantedAuthority("ROLE_USER");
GrantedAuthority grantedAuthorityAdmin = new SimpleGrantedAuthority("ROLE_ADMIN");
grantedAuthorities = Arrays.asList(grantedAuthorityUser, grantedAuthorityAdmin);
}
return grantedAuthorities;
}
安全配置
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private AuthFailure authFailure;
@Autowired
private AuthSuccess authSuccess;
@Autowired
private EntryPointUnauthorizedHandler unauthorizedHandler;
@Autowired
private UserDetailsServiceImpl userDetailsService;
/*@Autowired
public void configAuthBuilder(AuthenticationManagerBuilder builder) throws Exception {
builder.userDetailsService(userDetailsService);
}*/
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
@Autowired
@Override
public void configure(AuthenticationManagerBuilder builder) throws Exception {
builder.userDetailsService(userDetailsService);
}
private CsrfTokenRepository csrfTokenRepository() {
HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository();
repository.setHeaderName("X-XSRF-TOKEN");
return repository;
}
@Override
public void configure(HttpSecurity http) throws Exception {
http.csrf().csrfTokenRepository(csrfTokenRepository())
.and().exceptionHandling().authenticationEntryPoint(unauthorizedHandler)
.and().formLogin().loginPage("/login").successHandler(authSuccess).failureHandler(authFailure)
//.and().authorizeRequests().antMatchers("/rest/**").authenticated()
//.and().authorizeRequests().antMatchers("/**").permitAll()
.and().addFilterAfter(new CsrfHeaderFilter(), CsrfFilter.class);;
}
帐户控制器
@Secured("ROLE_USER")
@RequestMapping(method = RequestMethod.GET)
public List<Account> getAllAccounts(@RequestParam(value = "mail", required = false) String mail) {
谢谢!
【问题讨论】:
-
请您告诉我们您的映射是什么样的?它是在控制器上全局定义的,还是你有任何用 @RequestMapping(...) 注释的方法?
-
我已经用@RestController 和@RequestMapping('rest/accounts') 注释了我的AccountController 类。我已在原始帖子中添加了此代码。然后我为每个方法分别设置@RequestMapping(例如@RequestMapping(value=/{id}, method=RequestMethod.GET)
-
您可以使用@EnableWebMvcSecurity 启用mvc 安全并重试吗?
标签: java spring spring-security annotations