我开始使用Spring Security。现在我设置用户必须登录,如果他们不会创建表。或者,例如,在ControllerClass中,我配置为只有具有角色ROLE_USER的用户才能删除表。
我的问题是,我可以通过哪种方式设置,当用户登录并创建一些表并创建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上的一个简介。每个人都可以看到我们写的东西,每个人都可以创建profil,只有我可以编辑我在网站上写的我的简历或我的quastions。我怎么能用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;
}
这是班级表......
@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服务器,backbone.js ....
答案 0 :(得分:2)
不是一个详细的答案,但是评论已经太长了。
Spring安全性附带的功能正是您所需要的:Domain Object Security or ACLs
这是一个相当高级的功能,因为如果需要添加一组表来表示每个安全域对象上的用户授权。一个用于对象类,一个用于对象本身(仅存储主键),另一个用于实际授权。实际上,它可以被视为共享文件系统的授权。
您通常使用@PreAuthorize
注释使用then方法安全性,该注释允许使用包含方法实际参数的表达式。您可以直接允许用户修改或删除每个域对象。
除了上面引用的Spring Security Reference Manual之外,您还可以在krams::: Spring Security 3: Full ACL Tutorial上找到有关ACL的完整教程。
我的建议:如果您遇到某些特定问题,请尝试并尝试并提出问题。
答案 1 :(得分:0)
您可以在实体中使用@ 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 ");
}
}