Как реализовать роли в Spring Security? - PullRequest
0 голосов
/ 23 декабря 2018

Я занимаюсь разработкой веб-приложения Spring MVC.Я хочу реализовать 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;
    }

 }

каталоги проектов

project directories image

Подробнее

Проект имееттри основные роли: администратор, пользователь и клиент.Каждая роль имеет права доступа к страницам в каталоге, содержащем имя роли из каталога веб-приложения.Например: пользовательская роль может обращаться к страницам внутри каталога пользователя и то же самое для других ролей.

В текущей ситуации администратор может получить доступ к каждому каталогу, а другие роли не могут получить доступ ни к чему в приложении.

Я думаю, что моя проблема в файле context-security, но я не могу понять, в чем проблема.

1 Ответ

0 голосов
/ 24 декабря 2018

Важен порядок interpect-url, см. Справочник по безопасности пружин :

43.1.24

Этот элемент используется для определения набора шаблонов URL, которые интересуют приложение, и для настройки способа их обработки.Он используется для построения FilterInvocationSecurityMetadataSource, используемого FilterSecurityInterceptor.Он также отвечает за настройку ChannelProcessingFilter, если HTTPS, например, должен обращаться к определенным URL-адресам.При сопоставлении указанных шаблонов с входящим запросом сопоставление выполняется в порядке, в котором элементы объявлены.Таким образом, наиболее конкретные шаблоны должны стоять первыми, а самые общие - последними.

Ваша измененная часть конфигурации:

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...