Reputation: 1102
In JEE there is @RunAs("role_name")
annotation, that allows to invoke application methods under a particular role.
Is there a @RunAs
analog in Spring?
If there is no equivalent annotations, which are other ways to invoke methods with some role?
Upvotes: 4
Views: 2241
Reputation: 1102
I also found a quick solution of adding a custom user into security context. Since I need this for invoking secured service methods in Kafka listener class, that is not affected by any authentication process by itself.
User user = new User("SYSTEM", "SYSTEM", "SYSTEM");
UserDetailsImpl userDetails = new UserDetailsImpl(user,
Arrays.asList(<YOUR_ROLE_HERE>));
// UserDetailsImpl - class that implements
// org.springframework.security.core.userdetails.UserDetails
UsernamePasswordAuthenticationToken token =
new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(token);
Upvotes: 0
Reputation: 7286
Set up the spring RunAsManager then annotate your method with @Secured("RUN_AS_<MY_ROLE>")
, where <MY_ROLE>
is the role you wish to execute the method as.
The key here is the prefix RUN_AS
. It triggers the run as logic to add the suffixed role.
Upvotes: 1
Reputation: 3033
With Spring Security, you can use @PreAuthorize("hasRole('ROLE')")
as:
@PreAuthorize("hasRole('ROLE_SUPER_ADMIN') or hasRole('ROLE_ADMIN')")
public ResponseEntity<UserResponse> getAllUserByRole(...) {
}
What it is saying is, this particular method can be invoked by only user with ROLE either SUPER_ADMIN
or ADMIN
.
Upvotes: 1