spring - 有没有办法在 Getters 中使用 @PreAuthorize?(弹簧靴)
问题描述
我正在尝试为不同的用户角色使用不同的对象。
@Component
public class TestObject {
private String name;
private String secret;
@PreAuthorize("hasRole('ADMIN')")
public String getSecret() {
return secret;
}
public void setSecret(String secret) {
this.secret = secret;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
有没有办法像这样使用@PreAuthorize?
解决方案
您@PreAuthorize
只能在 Spring Managed Bean 中使用。
如果您必须创建一个对象的多个实例,则这些实例不由应用程序上下文管理。
如果你用 标记一个类@Component
,这将成为一个 Spring bean,并且可以由应用程序上下文注入和管理。现在,如果您(不是 Spring)创建这个类的一个实例,那么这个特定的实例不是由 Spring 管理的。
这意味着,这@PreAuthorize
在这种情况下不起作用。
一种解决方法是使用SecurityContextHolder
.
像这样的东西:
实用程序.java
public class Utils {
public static boolean isAdmin() {
Collection<?extends GrantedAuthority> authorities = SecurityContextHolder.getContext()
.getAuthentication().getAuthorities();
for (GrantedAuthority authority: authorities) {
if (authority.getAuthority().equalsIgnoreCase("ADMIN")) {
return true;
}
}
return false;
}
}
测试对象.java
public class TestObject {
private String name;
private String secret;
public String getSecret() {
if(Utils.isAdmin())
return secret;
return null;
}
public void setSecret(String secret) {
this.secret = secret;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
推荐阅读
- java - java可以用循环创建多个哈希集吗
- javascript - 当我添加到数组时,苗条列表不会更新
- c# - 有没有办法让一个已经在移动的运动刚体跟随另一个非运动刚体的位置?
- node.js - 在 dockerfile 中使用棱镜?
- excel - 如何获取 API 数据的增量快照?
- firebase - 将 Firebase 项目的访问权限授予其他开发人员。安全吗?
- angular - Angular如何在其他页面上显示页面作为路由器
- javascript - 全局函数在使用 jquery .load() 加载的 html 范围内未定义
- javascript - 如何将表单数据放入javascript中的对象中?
- c# - C#:您可以将三元条件运算符 (?:) 应用于语句吗?