REST API、oAuth2、spring 安全和角色
REST API, oAuth2, spring security and roles
在我的应用程序中,我实现了 oauth2
AuthorizationServer 和 ResourceServer。我系统中的每个用户都有一组角色(权限)。
我想使用 oauth2 和基于用户角色的安全性来保护我的 Spring MVC REST 端点。
是否可以将 oAuth2 authentication/authorization 与 UserDetails.getAuthorities() 方法中定义的不同角色(权限)一起使用?
我的配置:
private final static class DBUserDetails extends User implements UserDetails {
private static final long serialVersionUID = 1L;
private DBUserDetails(User user) {
super(user);
}
public Collection<? extends GrantedAuthority> getAuthorities() {
return AuthorityUtils.createAuthorityList("ROLE_USER");
}
public String getUsername() {
return getName();
}
public boolean isAccountNonExpired() {
return true;
}
public boolean isAccountNonLocked() {
return true;
}
public boolean isCredentialsNonExpired() {
return true;
}
public boolean isEnabled() {
return true;
}
}
和
@Configuration
@EnableResourceServer
protected static class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {
@Override
public void configure(ResourceServerSecurityConfigurer resources) {
resources
.resourceId(RESOURCE_ID);
}
@Override
public void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/profile/*").hasRole("PERMISSION_ADMIN")
.and().csrf()
.disable().sessionManagement().sessionCreationPolicy(STATELESS);
}
}
@RestController
@RequestMapping("/api/v1.0/profile")
public class ProfileController {
@PreAuthorize("hasRole('PERMISSION_ADMIN')")
@RequestMapping("/currentUser")
public User currentUser(@AuthenticationPrincipal User user) {
return user;
}
}
我想与拥有 PERMISSION_ADMIN
的用户一起保护 /profile/*
路径。但是现在任何拥有 accessToken 的人都可以访问这个端点。我哪里错了?
我想你可以在 ResourceServerConfiguration 中使用 OAuth2SecurityExpressionMethods 对我来说它是这样工作的:
http
.requestMatchers().antMatchers("/oauth/api")
.and()
.authorizeRequests()
.antMatchers("/oauth/api").access("#oauth2.hasRole('ADMIN')")...
在我的应用程序中,我实现了 oauth2
AuthorizationServer 和 ResourceServer。我系统中的每个用户都有一组角色(权限)。
我想使用 oauth2 和基于用户角色的安全性来保护我的 Spring MVC REST 端点。
是否可以将 oAuth2 authentication/authorization 与 UserDetails.getAuthorities() 方法中定义的不同角色(权限)一起使用?
我的配置:
private final static class DBUserDetails extends User implements UserDetails {
private static final long serialVersionUID = 1L;
private DBUserDetails(User user) {
super(user);
}
public Collection<? extends GrantedAuthority> getAuthorities() {
return AuthorityUtils.createAuthorityList("ROLE_USER");
}
public String getUsername() {
return getName();
}
public boolean isAccountNonExpired() {
return true;
}
public boolean isAccountNonLocked() {
return true;
}
public boolean isCredentialsNonExpired() {
return true;
}
public boolean isEnabled() {
return true;
}
}
和
@Configuration
@EnableResourceServer
protected static class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {
@Override
public void configure(ResourceServerSecurityConfigurer resources) {
resources
.resourceId(RESOURCE_ID);
}
@Override
public void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/profile/*").hasRole("PERMISSION_ADMIN")
.and().csrf()
.disable().sessionManagement().sessionCreationPolicy(STATELESS);
}
}
@RestController
@RequestMapping("/api/v1.0/profile")
public class ProfileController {
@PreAuthorize("hasRole('PERMISSION_ADMIN')")
@RequestMapping("/currentUser")
public User currentUser(@AuthenticationPrincipal User user) {
return user;
}
}
我想与拥有 PERMISSION_ADMIN
的用户一起保护 /profile/*
路径。但是现在任何拥有 accessToken 的人都可以访问这个端点。我哪里错了?
我想你可以在 ResourceServerConfiguration 中使用 OAuth2SecurityExpressionMethods 对我来说它是这样工作的:
http
.requestMatchers().antMatchers("/oauth/api")
.and()
.authorizeRequests()
.antMatchers("/oauth/api").access("#oauth2.hasRole('ADMIN')")...