0

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-configmavenの依存関係を持っています。

私の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>

要約すると、 UserDetailsS​​ervice の実装は機能します (ユーザーの資格情報でログインでき、ロガーは許可された権限を出力するので、それらがそこにあることがわかります)、実際にはアクセスできないはずの場合でも、ユーザーはパス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());
}
4

1 に答える 1