web-dev-qa-db-ja.com

antMatchers Spring Securityパターンと変更可能なURLユーザーID

私は長い間答えを探していましたが、生産的なものを見つけることができませんでした

私の残りのサービスでは、/ account/{id}/downloadの下にいくつかの機能を保持し、SecurityConfig Javaファイル、ROLE_TOKENSAVEDユーザーのみがこのURLにアクセスできるファイルにアクセスROLEを設定したい

{id}が変更可能な場合、パターンはどのように見えますか?

いくつかの正規表現パターンを試しましたが、期待どおりに機能しませんでした。ここにいくつかの試みを示します。

1. antMatchers("account/**/download").access(somerolehere)
2. antMatchers("account/\\d/download").access(somerolehere)
3. antMatchers("account/[\\d]/download").access(somerolehere)

あなたの回答者に事前に感謝します:)

編集:

    @Override
    protected void configure(HttpSecurity http) throws Exception {            
        http.authorizeRequests()
                .antMatchers("/admin**").access("hasRole('ROLE_ADMIN')")
                .antMatchers("/account*//**").access("hasRole('ROLE_USER') or hasRole('ROLE_ADMIN')")
                .antMatchers("/account/\\d+/download").access("hasRole('ROLE_TOKENSAVED')")
                .antMatchers("/user**").permitAll()
                //othercode...
    }
25
azalut

これは私のために働く:

antMatchers("/account/{\\d+}/download").access("hasAnyAuthority('ROLE_TOKENSAVED')")

IDを表すパス変数を囲む中括弧に注意してください。

29

ボフスラフが提案することは機能しますが、完全ではありません。 AntPathMarcherのドキュメントによると、 http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/util/AntPathMatcher.html

正規表現でパス変数を指定する必要があります。

_{spring:[a-z]+} matches the regexp [a-z]+ as a path variable named "spring"_

そうでない場合は、他のルートを公開できます。例えば:

http .authorizeRequests() .antMatchers(HttpMethod.GET, "/users/{^[\\d]$}").authenticated() .antMatchers("/users/**").hasAuthority("admin")

userControllerのこれらのメソッド:

_@ResponseBody
@RequestMapping(value = "/users/{userId}", method = RequestMethod.GET)
public User getUser(@PathVariable("userId") Object id) {
    return userService.getUserById(userId);
}

@ResponseBody
@RequestMapping(value = "/users/roles", method = RequestMethod.GET)
public List<String> getAllRoles() {
    return userService.getAllRoles();
}
_

パス変数userIdを指定しなかったため、ユーザーは管理者権限がなくても "/ users/roles"でGET要求を実行できます。また、管理者の承認が必要な場合でも、「/ users/test」などの他の先物ルートも公開されます。それを防ぐには:

antMatchers("/account/{accountId:[\\d+]}/download") .access("hasAnyAuthority('ROLE_TOKENSAVED')")

パス変数の名前が「accountId」の場合

11
LethalLima