java - 如何从 web.xml 中检索权限
问题描述
我想知道是否有更好的方法(无需反射)来获取特定 URL 和角色的 java.security.Permissions。
例如:
boolean canAccess = SecurityController.isAllowedToAccessUrl("/pages/confirmOrders.action", Collections.singletonList(new UserPrincipal("Dave")));
将使用以下约束(web.xml):
<security-constraint>
<web-resource-collection>
<web-resource-name></web-resource-name>
<url-pattern>/pages/confirmOrders.action</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>Dave</role-name>
</auth-constraint>
我在下面写的代码效果很好。我不喜欢的是我必须使用反射从 DelegatingPolicy.getInstance() 调用 getContextPolicy 并从 ContextPolicy 调用 getPermissionsForRole。
import org.jboss.security.jacc.ContextPolicy;
import org.jboss.security.jacc.DelegatingPolicy;
import javax.security.jacc.PolicyConfigurationFactory;
import javax.security.jacc.PolicyContext;
import javax.security.jacc.PolicyContextException;
import javax.security.jacc.WebResourcePermission;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.security.Permissions;
import java.security.Principal;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
public class SecurityController {
private static final Logger LOG = Logger.getLogger(SecurityController.class.getName());
static boolean isAllowedToAccessUrl(final String url, final List<Principal> principalRoles) {
initializeConfigurationInService();
boolean result = false;
for (Principal principalRole : principalRoles) {
try{
final ContextPolicy contextPolicy = getContextPolicy();
final Permissions permissions = getPermissionsFromContextPolicy(contextPolicy, principalRole.getName());
result |= permissions.implies(new WebResourcePermission(url, new String[] {"GET","POST"}));
}catch (Exception e){
LOG.log(Level.SEVERE, "checkAllowed failed checking if : ", e);
}
}
return result;
}
private static void initializeConfigurationInService() {
try {
final PolicyConfigurationFactory policyConfigurationFactory = PolicyConfigurationFactory.getPolicyConfigurationFactory();
policyConfigurationFactory.getPolicyConfiguration(PolicyContext.getContextID(), false);
} catch (PolicyContextException | ClassNotFoundException e) {
LOG.log(Level.INFO, "initializeConfigurationInService", e);
}
}
private static Permissions getPermissionsFromContextPolicy(ContextPolicy contextPolicy, String loginName) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
final Method getPermissionsForRole = contextPolicy.getClass().getDeclaredMethod("getPermissionsForRole", String.class);
getPermissionsForRole.setAccessible(true);
return (Permissions) getPermissionsForRole.invoke(contextPolicy, loginName);
}
private static ContextPolicy getContextPolicy() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
final DelegatingPolicy delegatingPolicy = DelegatingPolicy.getInstance();
final Method getContextPolicy = delegatingPolicy.getClass().getDeclaredMethod("getContextPolicy", String.class);
getContextPolicy.setAccessible(true);
return (ContextPolicy) getContextPolicy.invoke(delegatingPolicy, PolicyContext.getContextID());
}
}
我以编程方式从 web.xml 中读取了检索安全约束,但发现它不是很有用。
任何意见,想法都非常欢迎。谢谢!
解决方案
Java EE 8 中提供了一种类似的标准方法来执行“isAllowedToAccessUrl”函数。
boolean hasAccessToWebResource(String resource, String... methods)
根据 Servlet 规范第 13.8 节的规定,检查调用者是否可以使用给定的方法访问提供的“网络资源”。如果 Web 资源不受保护(约束),或者当它受角色保护并且调用者处于该角色中时,调用者具有访问权限。
推荐阅读
- google-earth-engine - 如何从 Google 地球引擎导出 Tiff 图像
- reactjs - 我应该将 _myMethod 用于功能组件吗?
- jquery - TwentyTwenty JQuery 插件未显示所有图像。调整窗口大小时显示所有图像
- android - Flutter List Tile 中的垂直分隔线未延伸到全高
- spring-cloud-dataflow - Spring Cloud 数据流部署卡在负载上
- javascript - 如何验证输入的时间在javascript中的两个给定时间之间
- regex - 将每个非 www 或 http 域重定向到 www 和 https
- mongodb - 改进 mongo 聚合以构建二分图
- javascript - 在 while 循环中向 JSON 添加条目
- python - AttributeError:'list' 对象没有来自 Tfidf_vect.fit 的属性'lower'