2017-10-24 19 views
0

私はSpring-data-restを使用していくつかのエンティティを公開しており、Spring表現言語を使用してアクセス制御を設定し、ユーザーが自分に属しているエンティティのみを操作できるようにします。Springブート式のアクセス制御プロパティが見つかりません

私の主な目的は、そのユーザ名(文字列)にユーザIDが含まれており、ユーザーはプロパティID(ロング)を持つ:

私のリポジトリは、このようになります
@Entity 
@Table(name = "users") 
@Getter 
@Setter 
public class User { 

    @Id 
    @Column(name = "user_id", nullable = false, updatable = false) 
    private Long id; 

    ... 

} 

:しかし、とき

@Repository 
public interface UserRepository extends JpaRepository<User, Long> { 

    @Override 
    @PreAuthorize("hasRole('ROLE_ADMIN')") 
    User findOne(Long id); 

    @Override 
    @PreAuthorize("#user.id == principal.username") 
    void delete(User user); 

    ... 

} 

1(プリンシパルのユーザー名にこのIDが含まれています)のユーザーとして認証された場合、DELETE /users/1を呼び出すと、次の例外が発生します。

java.lang.IllegalArgumentException: Failed to evaluate expression '#user.id == principal.username' 
... 
Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1007E: Property or field 'id' cannot be found on null 

私の表現は公式Spring documentationに基づいています。私はここで何が欠けているのか誰かが指摘できますか?

EDIT: すべてのメソッドがリポジトリに追加されました。これらのメソッドは相互接続されているように見えます。

@Override 
    @PreAuthorize("#user.getId() == authentication.getName()") 
    void delete(@RequestParam(name="user", required=true)User user); 
    ..... 

あなたが持っている:あなたはidprivateはそう、あなたのコードは、ユーザーIDを取得するためのパブリックメソッドを呼び出す必要があることに注意しなければならないので、それはこのようなものでなければならUserあなたのクラスで

答えて

0

publicメソッドを呼び出して、プリンシパルからユーザー名を取得します。

@Autowired 
    private SecurityCheck securityCheck; 

    ................ 

    @Override 
    @PreAuthorize("@securityCheck.check(#user,authentication)") 
    void delete(User user); 

そしてSecurityCheckクラスでこのようdifinedすることができます:

また、あなたが例えば、より多くのロジックを実行するために、セキュリティチェック機能への呼び出しを行うことができますので、ご注意ください

@Component 
public class SecurityCheck { 


public boolean check(User user, Authentication authentication) { 
    if(user == null) 
     return false; 
    if(user.getId().equals(authentication.getName()))  
     return true; 
    // more logic ... 
    return false; 
} 
} 
+0

ありがとうございました。しかし、今私はプリンシパルにアクセスできません: '原因:org.springframework.expression.spel.SpelEvaluationException:EL1004E:メソッド呼び出し:メソッドgetUsername()がjava.lang.String型で見つかりません' – Smajl

+0

そして、 – Smajl

+0

私はあなたがプリンシパル – Hasson

関連する問題