2016-11-28 26 views
3

假設我有兩個實體如下:確保認證的用戶只能更新自己的唱片

@Entity 
public class ClassA { 
    private Long id; 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    @OneToMany 
    private Set<ClassB> classBs = new HashSet<>(); 
} 
@Entity 
public class ClassB { 
    private Long id; 
    private String name; 


    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

也就是說,ClassA的包含一組ClassB的的。而像這樣的資源來更新ClassA的:

@RequestMapping(method = RequestMethod.PUT) 
public ClassA update(@RequestBody ClassA a){ 
    // Update code here 
} 

,然後在DAO(使用Hibernate)以下被稱爲數據庫中的更新ClassA的:

@Override 
public ClassA save(ClassA classA) { 
    sessionFactory.getCurrentSession().saveOrUpdate(classA); 
    return classA; 
} 

更新情況下,如果經過身份驗證的用戶將ClassB實例的id更改爲屬於另一個用戶的id,我們發現沒有任何保護措施阻止用戶更新不屬於它們的對象。有什麼方法可以防止這種情況發生?防止這種情況發生的最佳做法是什麼(即防止他們更新另一個用戶的詳細信息)?

回答

1

Access Control using @PreAuthorize and @PostAuthorize:使用@PreAuthorize和@PostAuthorize

最明顯的有用的註釋是@PreAuthorize其決定是否一個方法,其實是可以調用與否

訪問控制。例如(來自「聯繫人」示例應用程序)

@PreAuthorize("hasRole('USER')") 
public void create(Contact contact); 

這意味着存取將只被允許用於與作用「ROLE_USER」用戶。顯然,使用傳統配置和簡單配置屬性來實現所需角色可以輕鬆實現同樣的目的。但是什麼:

@PreAuthorize("hasPermission(#contact, 'admin')") 
public void deletePermission(Contact contact, Sid recipient, Permission permission); 

這裏我們實際使用的方法參數作爲表達式的一部分來決定當前用戶是否具有給定的接觸「管理員」權限。如下所示,內置的hasPermission()表達式通過應用程序上下文鏈接到Spring Security ACL模塊中。您可以按名稱訪問任何方法參數作爲表達式變量。

0

這叫做商業邏輯。休眠沒有概念id字段是爲了表示一個用戶。它不會阻止您將該字段設置爲您想要的任何值。

正在調用此代碼,即正在更改ID字段,需要知道id字段的限制,並防止用戶更改它。你應該在你的UI和你的DAO之間有一個業務層來做這種檢查。

+0

謝謝你的回答,我很欣賞你在說什麼。在這種情況下,我們在控制器和DAO之間有一個服務層,因此在兩者之間使用邏輯就可以將其排除。我想問的是更多的問題是否可以自動讓hibernate(或者可能是spring/spring-security)爲你做這項工作?或者,如果這樣做的方法已知並記錄在某處。 –

相關問題