Spring Security 使用Spring & Jobrunr进行授权检查

6kkfgxo0  于 2023-05-29  发布在  Spring
关注(0)|答案(1)|浏览(185)

我正在创建一个有4个角色的应用程序。我的数据库中没有存储权限,只有角色。
在控制器级别,我将路由仅限于某些角色,例如:

@PreAuthorize("hasRole('ADMIN')")

在我的服务方法中,我根据需要做了更彻底的检查。
然而,我在服务中使用授权条件的问题是,它只在SecurityContextHolder.getContext()不为null时才有效。
我意识到这可能是这样的,例如,在我与Jobrunr的一份工作中。
所以我将我的服务注入到我的作业中,我想调用一个方法,但它崩溃了,因为它无法检索经过身份验证的用户。
是否有一种方法可以在作业中手动验证用户,这是一种好方法吗?

e4yzc0pl

e4yzc0pl1#

您可以 Package 由DelegatingSecurityContextRunnable提交给Jobrunr的Runnable
它要求您定义SecurityContext以运行Runnable,并且它将负责在运行任务之前和之后设置和清理SecurityContext
在配置SecurityContext时,最好与现有使用的身份验证机制保持一致,以定义一个具有足够权限来运行作业的Authentication对象。
下面是一个入门示例:

//origin runnable task submitted to Jobrunr
Runnable task = () -> System.out.println("doing some task");

//Configure the SecurityContext that has enough permission to execute the task

SecurityContext securityContext = SecurityContextHolder.createEmptyContext();
List<GrantedAuthority> grantedAuthorities = new ArrayList<>();
grantedAuthorities.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
// Here it does not matter what values username and password are. Just ensure this user has the the Admin GrantedAuthority and his account is enabled
User user = new User("admin", "password", true, true, true, true, grantedAuthorities);
Authentication authentication = new UsernamePasswordAuthenticationToken(user, user.getPassword(), user.getAuthorities());
securityContext.setAuthentication(authentication);

//wrap the task by DelegatingSecurityContextRunnable
DelegatingSecurityContextRunnable securedRunnable = new DelegatingSecurityContextRunnable(task,securityContext);

//Submit the secured task to Jobrunr
BackgroundJob.enqueue(securedRunnable);

相关问题