实际上我的代码如下:
@PreAuthorize("hasAuthority('admin')")
@RequestMapping(value = "/xxxx", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
public ResponseEntity<> method(@RequestBody RequestClass request) {
}
如您所见,允许的权限以Java代码硬编码。
有没有一种方法可以覆盖PreAuthorize
的行为,或者在启动时从外部源(数据库或配置文件)加载正确的端点配置?
答案 0 :(得分:0)
我想您可以尝试这样的操作(可能需要一些调整),但这很丑陋,我自己不会做...
permissions.method1: admin
permissions.method2: admin
permissions.method3: user
@ConfigurationProperties("")
public class SecurityMappingProperties {
private final Map<String, String> permissions = new HashMap<>();
public Map<String, String> getPermissions() {
return permissions;
}
}
@Service
public class MethodPermissionService {
@Autowired
private SecurityMappingProperties mappingProperties;
//lookup the mapped role and see if you user has it..
public Boolean lookupPermissionForMethod(String method){
return doesUserHaveRole(mappingProperties.get(method));
}
private Boolean doesUserHaveRole(String role){
//implement whatever logic you want to look up the requesting user's role...
}
}
@PreAuthorize("@methodPermissionService('method1')")
当然,这需要您在所有控制器的所有中具有每个安全方法,并具有@Preauthorize,其匹配方法名称作为参数的参数。 methodPermissionService('xxx')。
由于我们已经在这个兔子洞中了,如果您真的想要,则可以只在一个MethodRoleHolder类中声明一个所有对象,您可以在其中将它们设为静态字符串,如下所示:>
public static final String METHOD1_SECURITY = "@methodPermissionService('method1')";
public static final String METHOD2_SECURITY = "@methodPermissionService('method2')";
然后在您的控制器中使用它们...
@PreAuthorize(MethodRoleHolder.METHOD1_SECURITY)
预先警告:我实际上并没有完全按照此处的说明尝试此操作,但是我实现了与此类似的安全方案,只是没有动态角色映射查找部分。