目前我正在编写自己的自定义@PreAuthorize注解。我的案例如下,
1.我正在运行保存用户详细信息、角色和权限的授权KeyCloak服务器
1.验证后,我已将权限详细信息存储在GrantedAuthority中,如下所示:"{rsname}:GET"、"{rsname}:POST ..."
KeyCloak JWT权限结构:
"authorization": {
"permissions": [
{
"scopes": [
"GET",
"DELETE",
"POST"
],
"rsid": "6ae9895f-3766-464f-82c4-44f598ec2a93",
"rsname": "record"
}
]
}
1.当在控制器中使用@PreAuthorize注解而不是硬编码资源名称和作用域时,我们必须通过从www.example.com获取详细信息来概括它,我们已经实现了如下, application.property we have achieved it as follows,
application.property:
auth:
data:
name1: record
name2: device
属性详图构件类:
@ConfigurationProperties(prefix = "auth")
@Component
public class SecurityProperty {
private Map<String, String> data;
....
}
控制器:
@RequestMapping (method = RequestMethod.GET,value = "/api/records",
produces = {"application/json"})
@PreAuthorize ("hasAuthority (@securityProperty.getData(). get('name1') "
+ "+ ': GET')")
ResponseEntity<List<SomeDTO>> getRecords() {
...Some Logic
}
@RequestMapping(method = RequestMethod.GET,value = "/api/devices",
produces = { "application/json" })
@PreAuthorize("hasAuthority(@securityProperty.getResources().get('name2') "
+ "+ ':GET')")
ResponseEntity<List<SomeDTO>> getDevices() {
...Some Logic
}
1.到目前为止,这一切都很顺利。因为我们正在创建一个大项目,我们不想写这个冗长的@PreAuthorize(XXXX)注解,所以决定创建使用@PreAuthorize的自定义注解。我们创建了如下的@CustomPreAuthorize
@Retention(RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
@PreAuthorize("hasAuthority(@securityProperty.getResources().get(#resource)"
+ ".concat(':GET'))")
public @interface CustomPreAuthorize {
String resource();
}
并将其用于控制器
@RequestMapping (method = RequestMethod.GET,value = "/api/devices",
produces = {"application/json"})
@CustomPreAuthorize (resource = "name2")
ResponseEntity<List<SomeDTO>> getDevices() {
...Some Logic
}
发布日期:
1.当我像这样使用时,当调用API时,我得到以下错误
Failed to evaluate expression 'hasAuthority(@securityProperty.getResources().get(#resource).concat(':GET'))"
1.到目前为止,我所理解的是资源和作用域在@PreAuthorize注解级别中没有得到识别。是否可以像这样读取值,或者是否有其他可用的替代方法?
1条答案
按热度按时间olhwl3o21#
由于所需的修复还没有回复,现在我们已经修复了这个问题,方法是为注解添加Aspect,并使用SecurityContextHolder进行手动权限检查。
我们将积极检查其他解决方案,并张贴,如果我们实现了更好的方式。