【问题标题】:How to implement roles in Spring Security?如何在 Spring Security 中实现角色?
【发布时间】:2018-12-24 06:41:02
【问题描述】:

我正在开发一个 Spring MVC Web 应用程序。我想为特定角色实现 Spring Security。我有三个角色:用户、管理员和客户。

这是我的代码示例:

context-security.xml

<global-method-security
    secured-annotations="enabled" proxy-target-class="true">
</global-method-security>

<http pattern="/resources/**" security="none" />
<http pattern="/javax.faces.resource/**" security="none" />
<http pattern="/img/**" security="none" />
<http pattern="/login*" security="none" />

<http auto-config="true" access-denied-page="/accessDenied.xhtml">
    <anonymous enabled='false' />
    <intercept-url pattern="/login*"
        access="IS_AUTHENTICATED_ANONYMOUSLY" />

    <intercept-url pattern="/**" access="ROLE_ADMIN" />
    <intercept-url pattern="/pages/user**"
        access="ROLE_USER" />
    <intercept-url pattern="/pages/cutomer**"
        access="ROLE_CUSTOMER" />

    <form-login login-processing-url="/j_spring_security_check"
        login-page="/login.xhtml"
        authentication-success-handler-ref="customSuccessHandler"
        authentication-failure-url="/login" />
    <logout logout-url="/logout" logout-success-url="/login"
        invalidate-session="true" delete-cookies="JSESSIONID" />
</http>

<beans:bean id="customAuthenticationProvider"
    class="com.invetechs.security.CustomAuthenticationProvider" />

<authentication-manager
    alias="authenticationManager">
    <authentication-provider
        ref="customAuthenticationProvider">
    </authentication-provider>
</authentication-manager>

HappyfacesUserDetails

public static final class HappyfacesUserDetails implements UserDetails {


    private static final long serialVersionUID = 1L;

    /** User. */
    private User user;

    /** Constructor. */
    private HappyfacesUserDetails(User user) {
        super();
        this.user = user;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public String getUsername() {
        return user.getUserName();
    }

    @Override
    public String getPassword() {
        return user.getPassword();
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        List<GrantedAuthority> roles = new ArrayList<GrantedAuthority>();
        roles.add(new GrantedAuthority() {
            private static final long serialVersionUID = 1L;

            @Override
            public String getAuthority() {

                if (user.getId() == -1L)
                    return "ROLE_ADMIN";
                else if (user.getId() == 1L )
                    return "ROLE_CUSTOMER";
                else
                    return "ROLE_USER";
            }

        });

        return roles;
    }

    public User getUser() {
        return user;
    }

 }

项目目录

更多详情

该项目具有三个主要角色:管理员、用户和客户。每个角色都有权访问目录中的页面,该目录包含来自 Web 应用程序目录的角色名称。例如:用户角色可以访问目录用户内的页面,其他角色也是如此。

在当前情况下,管理员可以访问每个目录,而其他角色无法访问应用程序中的任何内容。

我认为我的问题出在context-security 文件中,但我无法弄清楚问题所在。

【问题讨论】:

  • 您的/** 规则是第一个,因此匹配所有内容。定义规则的顺序也是参考它们的顺序!因此,将您的 /** 作为匹配的最后一条规则,而不是第一条。

标签: spring spring-mvc spring-security


【解决方案1】:

interpect-url的顺序很重要,见Spring Security Reference

43.1.24

此元素用于定义应用程序感兴趣的一组 URL 模式并配置应如何处理它们。它用于构造FilterSecurityInterceptor 使用的FilterInvocationSecurityMetadataSource。例如,如果特定的 URL 需要通过 HTTPS 访问,它还负责配置 ChannelProcessingFilter。将指定模式与传入请求匹配时,匹配按照元素声明的顺序进行。所以最具体的模式应该在前,最一般的模式应该在最后。

您修改的部分配置:

<http auto-config="true" access-denied-page="/accessDenied.xhtml">
    <anonymous enabled='false' />

    <intercept-url pattern="/login*" access="IS_AUTHENTICATED_ANONYMOUSLY" />
    <intercept-url pattern="/pages/user**" access="ROLE_USER" />
    <intercept-url pattern="/pages/cutomer**" access="ROLE_CUSTOMER" />
    <intercept-url pattern="/**" access="ROLE_ADMIN" />

    <form-login login-processing-url="/j_spring_security_check" login-page="/login.xhtml" authentication-success-handler-ref="customSuccessHandler" authentication-failure-url="/login" />
    <logout logout-url="/logout" logout-success-url="/login" invalidate-session="true" delete-cookies="JSESSIONID" />
</http>

【讨论】:

    猜你喜欢
    • 2014-05-01
    • 2018-07-28
    • 2019-02-13
    • 2018-07-14
    • 2017-08-20
    • 2018-06-02
    • 2014-09-14
    相关资源
    最近更新 更多