gpt4 book ai didi

java - 在 Spring 安全性中保护具有相同角色的用户之间的 Controller

转载 作者:行者123 更新时间:2023-12-01 13:43:16 25 4
gpt4 key购买 nike

在我的应用程序中,用户可以操纵仅链接到他们的事物。所有用户在 Spring Security 中都具有相同的角色。因此,为了禁止用户查看不属于他的内容,我需要在一些 Controller 方法中实现我自己的功能来验证用户权限。

public void securityValidation(User currentUser, Thing thing)  {
if(!thing.has(currentUser)) {
log.warn("Security Control. User: " + user .getId());
}
}

我觉得这不太酷。很难在代码中找到该方法是否安全。也许Spring有更优雅的方式来完成这个任务?

或者我可以编写自己的注释来保护方法?我需要注释处理器吗?

最佳答案

您指的是域对象安全性,它不是基本安全包的一部分。 Spring Security ACL是您所需要的,使用它您可以断言实际项目的所有权,例如用户 123 可以编辑项目 789。下面的代码确保当前用户对他正在编辑的实体拥有管理员权限:

@PreAuthorize("hasPermission(#entity, 'ADMINISTRATION')")
public SomeEntity update(SomeEntity entity) {
...
}

但请记住,您现在必须管理这些权限并将其授予/删除给各个用户。还有一种方法可以作为团体的一部分来完成。您可以说用户 123 和 345 属于 GROUP_SOME_ID,然后如果您授予 GROUP_SOME_ID 对某个对象的管理员权限,用户 123 和 345 将自动获得它们。从组中删除用户 123 也会自动删除他的权限。

---- 更新 ------

下面是连接 Spring Security ACL 的示例应用程序上下文:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:security="http://www.springframework.org/schema/security"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd">

<bean id="expressionHandler" class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler">
<property name="permissionEvaluator" ref="permissionEvaluator" />
</bean>

<!-- We'll rely on the standard AclPermissionEvaluator implementation -->
<bean class="org.springframework.security.acls.AclPermissionEvaluator" id="permissionEvaluator">
<constructor-arg ref="aclService" />
<property name="sidRetrievalStrategy" ref="sidRetrievalStrategy" />
<property name="permissionFactory" ref="permissionFactory"/>
</bean>

<bean class="org.springframework.security.acls.domain.SidRetrievalStrategyImpl" id="sidRetrievalStrategy" >
<constructor-arg ref="roleHierarchy" />
</bean>

<!-- Declare an acl service -->
<bean class="org.springframework.security.acls.jdbc.JdbcMutableAclService" id="aclService">
<constructor-arg ref="dataSource" />
<constructor-arg ref="lookupStrategy" />
<constructor-arg ref="aclCache" />
<property name="classIdentityQuery" value="select currval(pg_get_serial_sequence('acl_class', 'id'))" />
<property name="sidIdentityQuery" value="select currval(pg_get_serial_sequence('acl_sid', 'id'))" />
</bean>

<!-- Declare a lookup strategy -->
<bean id="lookupStrategy" class="org.springframework.security.acls.jdbc.BasicLookupStrategy">
<constructor-arg ref="dataSource" />
<constructor-arg ref="aclCache" />
<constructor-arg ref="aclAuthorizationStrategy" />
<constructor-arg ref="permissionGrantingStrategy" />
<property name="permissionFactory" ref="permissionFactory"/>
</bean>

<bean id="permissionFactory" class="org.springframework.security.acls.domain.DefaultPermissionFactory" />

<!-- Declare an acl cache -->
<bean id="aclCache" class="org.springframework.security.acls.domain.SpringCacheBasedAclCache">
<constructor-arg>
<bean class="com.example.NoOpCache">
<constructor-arg value="aclCache" />
</bean>
</constructor-arg>
<constructor-arg ref="permissionGrantingStrategy" />
<constructor-arg ref="aclAuthorizationStrategy" />
</bean>

<!-- Declare an acl authorization strategy -->
<bean id="aclAuthorizationStrategy" class="org.springframework.security.acls.domain.AclAuthorizationStrategyImpl">
<constructor-arg>
<list>
<bean class="org.springframework.security.core.authority.SimpleGrantedAuthority">
<constructor-arg value="ROLE_ADMIN" />
</bean>
<bean class="org.springframework.security.core.authority.SimpleGrantedAuthority">
<constructor-arg value="ROLE_ADMIN" />
</bean>
<bean class="org.springframework.security.core.authority.SimpleGrantedAuthority">
<constructor-arg value="ROLE_ADMIN" />
</bean>
</list>
</constructor-arg>
</bean>

<bean id="permissionGrantingStrategy" class="org.springframework.security.acls.domain.DefaultPermissionGrantingStrategy" >
<constructor-arg>
<bean class="org.springframework.security.acls.domain.ConsoleAuditLogger" />
</constructor-arg>
</bean>

<bean id="roleHierarchy" class="org.springframework.security.access.hierarchicalroles.RoleHierarchyImpl">
<property name="hierarchy">
<value>
ROLE_USER > ROLE_ANONYMOUS
ROLE_SUPER_USER > ROLE_USER
ROLE_ADMIN > ROLE_SUPER_USER
</value>
</property>
</bean>
</beans>

关于java - 在 Spring 安全性中保护具有相同角色的用户之间的 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20525901/

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