【问题标题】:Spring Security Role - user can change only own data?Spring Security Role - 用户只能更改自己的数据?
【发布时间】:2015-01-04 15:15:30
【问题描述】:

我开始使用 Spring Security。现在我设置该用户必须登录,如果他们不会创建表。或者,例如,在我配置为只有角色 ROLE_USER 的用户可以删除表的 ControllerClass 中。

我的问题是,当用户登录并创建一些表格并创建 teamPlayers 时,我可以通过哪种方式设置表格或玩家只能编辑或删除创建表格和玩家的用户。

例如,我在Controller方法中有删除表...

@RestController
@RequestMapping(value="/api/tables")
public class ApiTableController {

@Autowired
TableService tableService;
@Autowired
TableConverter tableConverter;

@PreAuthorize("hasRole('ROLE_USER')")    
@RequestMapping(value="/{id}", method=RequestMethod.DELETE)
public ResponseEntity<TableDTO> deleteTable(@PathVariable Long id) {
    Table table = tableService.findOne(id);
    if (table != null) {
        TableDTO tableDTO = tableConverter.table2TableDTO(table);
        tableService.remove(id);
        return new ResponseEntity<>(tableDTO, HttpStatus.OK);
    } else {
        return new ResponseEntity<>(HttpStatus.NOT_FOUND);
    }
}

在这种情况下,所有角色为 ROLE_USER 的用户都可以删除所有表,但我不会只删除表用户是如何创建表的……有什么规则它是如何工作的或标准代码吗?就像 StackOwerflow 上的配置文件一样。每个人都可以看到我们写的内容,每个人都可以创建配置文件,只有我可以编辑我的配置文件或我在网站上写的问题。我怎么能用 Spring 安全性做这样的事情?

这是用户类

@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue
@NotNull
@Column(name = "user_id")
private Long id;
@Column(name = "username")
private String name;
@Column(name = "password")
private String password;
@Column(name = "email")
private String email;
@Column(name = "country")
private String country;
@Column(name = "city")
private String city;
@Column(name = "dateCreated")
private Date dateCreated;
@Column(name = "enabled")
private boolean active;
@JoinTable(name = "user_security_role", joinColumns = { @JoinColumn(name = "user_id", 
referencedColumnName = "user_id") }, inverseJoinColumns = { 
@JoinColumn(name = "security_role_id", referencedColumnName = "id") })
@ManyToMany
private Set<SecurityRoleUser> securityRoleCollection;


@Override
public int hashCode() {

    int hash = 0;

    hash += (id != null ? id.hashCode() : 0);

    return hash;

}

@Override
public boolean equals(Object object) {

    if (!(object instanceof User)) {

        return false;

    }

    User other = (User) object;

    if ((this.id == null && other.id != null)
            || (this.id != null && !this.id.equals(other.id))) {

        return false;

    }

    return true;

}

这是类 Table ...

@Entity
@javax.persistence.Table(name="tblTable")
public class Table {
@Id
@GeneratedValue
@Column(name="table_id")
private Long id;
@Column(name="name", nullable=true)
private String name;
@Column(name="sport", nullable=true)
private String sport;
@Column(name="typeTable", nullable=true)
private String TypeTable;
@Column(name="dateCreated", nullable=true)
private Date dateCreated;
@Column(name="changed", nullable=true)
private Date changed;
@Column(name="description", nullable=true)
private String description;

我使用hibernate、maven、RESTFull web server、backbone.js....

【问题讨论】:

    标签: java spring hibernate spring-security


    【解决方案1】:

    您可以在您的实体中使用@PreRemove/@PreUpdate/@PrePersist 并实现您自己的逻辑。

      @PreRemove
        private void preventUnAuthorizedRemove() {
    
           String name = SecurityContextHolder.getContext().getAuthentication().getName();
    
          if(!name.equals(this.username)){
              throw new NotAuthorizedException("User can only delete himself ");
          }
    
        }
    

    【讨论】:

      【解决方案2】:

      不是很详细的答案,但已经太长了,无法发表评论。

      Spring 安全性附带的功能正是您所需要的:Domain Object Security or ACLs

      这是一个相当高级的功能,因为如果需要添加一组表来表示用户对每个安全域对象的授权。一种用于对象类,一种用于对象本身(仅存储主键),另一种用于实际授权。事实上,它可以看作是对共享文件系统的授权。

      您通常使用带有@PreAuthorize 注释的方法安全性,该注释允许使用包含方法实际参数的表达式。您直接允许用户修改或删除每个域对象。

      除了上面已经引用的 Spring Security Reference Manual 之外,您还可以在 krams::: Spring Security 3: Full ACL Tutorial 上找到有关 ACL 的完整教程。

      我的建议:如果您在某些特定问题上遇到困难,请尝试尝试并在这里提问。

      【讨论】:

      • 还有一个问题....我可以使用 Pre 或 Post Annotations 吗?要说这样的话 PreAuthorize("#table.userName == authentication.name") ,并且在每个表中我都输入了创建者表的使用名称。什么时候尝试删除,如果authentication.name = table.userName,loginUser和创建表的用户相同,可以删除表..???
      猜你喜欢
      • 2020-04-06
      • 1970-01-01
      • 1970-01-01
      • 2019-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-13
      • 1970-01-01
      相关资源
      最近更新 更多