私は長い間答えを探していましたが、生産的なものを見つけることができませんでした
私の残りのサービスでは、/ 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...
}
これは私のために働く:
antMatchers("/account/{\\d+}/download").access("hasAnyAuthority('ROLE_TOKENSAVED')")
IDを表すパス変数を囲む中括弧に注意してください。
ボフスラフが提案することは機能しますが、完全ではありません。 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」の場合