gpt4 book ai didi

java - 使用 spring security 和/或 shiro 的最佳实践

转载 作者:行者123 更新时间:2023-11-30 11:53:53 25 4
gpt4 key购买 nike

我对关于使用 Spring Security 或 Shiro 处理“权利”概念的最佳方式的意见很感兴趣。

例如,假设一个 JAX-RS 端点具有如下签名:

AccountDetails getAccountDetails(String accountId);

使用 Spring Security,我可能会注释这样的实现:

@Secured(AUTHORIZED_USER)
public AccountDetails getAccountDetails(String accountId) { ... }

或者使用 Shiro,

@RequiresAuthentication
public AccountDetails getAccountDetails(String accountId) { ... }

然而,我正在寻找的是关于如何确保用户有权访问特定帐户 ID(我认为这称为“权利管理”)的“最佳实践”的一些建议。

我可以想象出几种不同的方法:

@Secured(AUTHORIZED_USER)
@AccountEntitled
public AccountDetails getAccountDetails(@Account String accountId) { ... }

(这让我觉得使用 Spring Security 并不完全直截了当,但我宁愿错了)。

或者,我可以想象引入一个 AccountId 域对象,以及一个工厂,它只会成功地将 String 转换为 AccountId,如果当前安全上下文所遵循的原则允许用户查看该帐户。但这开始变得有点困惑。

总的来说,我不想在这里发明新概念;这看起来像是面包和黄油的东西,但我没能在这里找到关于最佳实践的可靠建议。

感谢您的任何建议。

最佳答案

听起来您正在尝试为特定帐户实现行级安全性。还有其他 Stackoverflow 问题(How to implement row-level security in Java?Database independent row level security solution)讨论了这个问题的潜在解决方案。此外,第一个答案中提供的链接讨论了实现 Row Level Security with Spring and Hibernate .但是,排名较高的答案建议直接在数据库级别实现行级安全性。

与 Shiro 合作后,我可以说这是可以做到的。但是,您必须实现自己的安全结构(领域、权限、注释)以适应您描述的功能类型。一种方法是添加一个类似于上一个示例中的注释,指示该方法需要权限检查。此注解将绑定(bind)到拦截器,拦截器又会生成适当的权限,然后调用安全框架来验证权限。

它看起来像这样。

方法:

@RequiresAuthorization
@Entitled
public AccountDetails getAccountDetails(@Account String accountId) {...}

拦截器:

@Interceptor
@Entitled
public class EntitledInterceptor {
@AroundInvoke
public void interceptOrder(InvocationContext ctx) {
// return type is AccountDetails
// parameter[0] is acccoundId
Permission p = new CustomPermission(context.getMethod().getReturnType(),
ctx.getParameters()[0]);
if(SecurityUtils.getSubject().isPermitted(p)){
return ctx.proceed();
} else {
throw new RowLevelSecurityException("No access!");
}
}

领域:

public boolean isPermitted(SubjectPrincipals principal, Permission p){
if( p instanceof CustomPermission){
CustomPermission cp = (CustomPermission) p;
Class<?> type = cp.getType(); //AccountDetails
Integer id = cp.getId(); //accountId
Integer userId = principal.getPrimaryPrincipal(); //or username
customPermissionCheckingLogic(userId, type, id);
}
}

显然,此实现依赖于 CDI,并且您可以根据提供的对象类型确定要检查的表(JPA 注释在这方面起作用)。此外,可能有一些方法可以连接到 Shiro 的注释扫描,以提供比我在这里所做的更直接/ native 的权限功能。

Documentation on CDI interceptors.

关于java - 使用 spring security 和/或 shiro 的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6019331/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com