AngularJS で Spring Security (Spring Boot アプリ) を使用しており、ユーザーに付与された権限に基づいて特定のマッピングへのアクセスを許可/拒否しようとしています。
ユーザー.java
public class User implements UserDetails {
...
private String username;
private String password;
private boolean enabled;
private List<GrantedAuthority> grantedAuthorities;
public User(...) {...}
private class Permission implements GrantedAuthority {
String permission;
public Permission(String permission) {
this.permission = permission;
}
@Override
public String getAuthority() {
return permission;
}
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return grantedAuthorities;
}
...
}
また、ユーザーデータにデータベースからのデータを入力するUserDetailsService
(メソッド)の独自の実装があります。loadUserByUsername(String username)
前述のマッピングは次のとおりです。
@RequestMapping("yes")
public void doesHaveAuthority() {yes();}
@PreAuthorize("hasAuthority('10001')")
private void yes() {}
@RequestMapping("no")
public void doesntHaveAuthority() {no();}
@PreAuthorize("hasAuthority('00000')")
private void no() {}
ユーザーが権限 "10001" を持っているが権限 "00000" を持っていない場合、へのアクセス/yes
は許可されるべきですが、へのアクセスは許可される/no
べきではありません。残念ながら、両方のパスが許可されています。
ここで述べたように、私はspring-security-config
mavenの依存関係を持っています。
私のWEB-INF/web.xml
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/security.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
および WEB-INF/security.xml
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security.xsd">
<context:component-scan base-package="com.mycompany.project" />
<global-method-security pre-post-annotations="enabled" />
</beans:beans>
要約すると、 UserDetailsService の実装は機能します (ユーザーの資格情報でログインでき、ロガーは許可された権限を出力するので、それらがそこにあることがわかります)、実際にはアクセスできないはずの場合でも、ユーザーはパスyes
とパスの両方にアクセスできます。彼/彼女は権限(許可)「00000」を持っていません。/no
/no
xml 構成が正しくないか、まったく読み取られていない可能性があります。
御時間ありがとうございます
更新M. Deinum がコメントで述べたように、Spring Boot は web.xml および security.xml ファイルを無視します。SecurityConfiguration
解決策は、 which extendsを変更WebSecurityConfigurerAdapter
し、対応する権限を持つ対応する antMatchers を追加することでした。
例:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.httpBasic().and()
.authorizeRequests()
.antMatchers("/login.html", "/index.html", "/").permitAll()
.antMatchers("/yes").hasAuthority("10001")
.antMatchers("/no").hasAuthority("00000")
.anyRequest()
.authenticated().and()
.addFilterAfter(new CSRFHeaderFilter(), CsrfFilter.class)
.csrf().csrfTokenRepository(csrfTokenRepository());
}