Роль безопасности Spring-пользователь может изменять только собственные данные?


Я начинаю использовать Spring Security. На данный момент я считаю, что пользователь должен войти в систему, если они не будут создавать таблицу. Или, например, в ControllerClass я настроил, чтобы только пользователь с ролью ROLE_USER мог удалить таблицу.

Мой вопрос заключается в том, каким образом я могу установить , что, когда пользователь входит в систему и он создает некоторую таблицу и создает teamPlayers, что таблица или игроки могут только редактировать или удалять пользователя, который создал таблицу и игроков.

Например, у меня есть в контроллере метод для удаления стол...

@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 . Каждый может видеть, что мы пишем, каждый может создать профиль, и только я могу редактировать свой профиль или мои квастиции, которые я написал на сайте. Как я могу сделать что-то подобное с весенней безопасностью?

Это класс User

@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 server, backbone.JS....

1   2   2014-11-07 21:37:14

1 ответ:

Не очень подробный ответ, но уже слишком длинный для комментария.

Spring security поставляется с функцией, которая именно то, что вам нужно: Domain Object Security или ACLs

Это довольно продвинутая функция, потому что если необходимо добавить набор таблиц для представления авторизации пользователей на каждом объекте защищенного домена. Один для классов объектов, один для самих объектов (хранится только первичный ключ) и другие для фактических разрешений. На самом деле, это может быть рассматривается как авторизация в общей файловой системе.

Вы обычно используете безопасность метода с аннотацией @PreAuthorize, которая позволяет использовать выражение, содержащее фактические параметры метода. Вы непосредственно разрешаете пользователю изменять или удалять каждый объект домена.

В дополнение к справочному руководству Spring Security, уже цитированному выше, вы можете найти полный учебник по ACL на krams::: Spring Security 3: Full ACL Tutorial.

Мой совет: попробуйте и экспериментируйте и задавайте вопросы, здесь вы застреваете на конкретных проблемах.