Spring Security — роли не работают должным образом

#java #spring #security

#java #spring #Безопасность

Вопрос:

У меня проблема с Spring Security. Я создал 3 роли (ROLE_ADMIN, ROLE_MOD, ROLE_USER). Я сохраняю роли в базе данных с паролями и именами пользователей. В JSP я создал 3 разных меню для всех ролей. Во всех меню есть 3 строки, которые повторяют «/ messages», «/profile», «/logout». Если я вхожу как МОД или ПОЛЬЗОВАТЕЛЬ, все работает нормально, но если я вхожу как АДМИНИСТРАТОР, я не могу получить доступ к «/ messages» и «/profile».

Что не так с моей конфигурацией или jsp?

конфигурация безопасности:

 @Override
protected void configure(HttpSecurity http) throws Exception {
    //@formatter:off
    http
        .authorizeRequests()
            .antMatchers("/"
                    ,"/tutorials"
                    ,"/search"
                    ,"/about"
                    ,"/contact"
                    ,"/register",
                    "/css/*",
                    "/js/*",
                    "/img/*")
            .permitAll()
            .antMatchers(
                    "/messages",
                    "/profile",
                    "/logout",
                    "/newsmanager",
                    "/tutorialsmanager",
                    "/usersmanager",
                    "/sendemails"
                    )
                .hasRole("ADMIN")
            .antMatchers(
                    "/suggestnews",
                    "/suggesttutorial",
                    "/messages",
                    "/profile",
                    "/logout"
                    )
                .hasRole("MOD")
            .antMatchers(
                    "/messages",
                    "/profile",
                    "/logout"
                    )
                .hasRole("USER")
            .and()
        .formLogin()
            .loginPage("/login")
            .defaultSuccessUrl("/")
            .permitAll()
            .and()
        .logout()
            .permitAll(); 

    //@formatter:on        
 }
  

фрагмент JSP:

  <sec:authorize access="hasRole('ROLE_ADMIN')">
        <button class="btn btn-default dropdown-toggle" type="button"
            id="dropdownMenu1" data-toggle="dropdown" aria-haspopup="true"
            aria-expanded="true">
            Account <span class="caret"></span>
        </button>
        <ul class="dropdown-menu" aria-labelledby="dropdownMenu1">
            <li><a href="/messages">Messages</a></li>
            <li><a href="/profile">Profile</a></li>
            <li role="separator" class="divider"></li>
            <li><a href="/tutorialsmanager">Tutorials manager</a></li>
            <li><a href="/newsmanager">News manager</a></li>
            <li><a href="/usersmanager">Users manager</a></li>
            <li><a href="/sendemails">Send emails</a></li>
            <li role="separator" class="divider"></li>
            <li><a href="javascript:$('#logoutForm').submit();">Log
                    out</a></li>
        </ul>
</sec:authorize>

    <!--  APPEARED FOR ROLE_USER -->
<sec:authorize access="hasRole('ROLE_USER')">
        <button class="btn btn-default dropdown-toggle" type="button"
            id="dropdownMenu2" data-toggle="dropdown" aria-haspopup="true"
            aria-expanded="true">
            Account <span class="caret"></span>
        </button>
        <ul class="dropdown-menu" aria-labelledby="dropdownMenu2">
            <li><a href="/messages">Messages</a></li>
            <li><a href="/profile">Profile</a></li>
            <li role="separator" class="divider"></li>
            <li><a href="javascript:$('#logoutForm').submit();">Log
                    out</a></li>
        </ul>
</sec:authorize>

    <!--  APPEARED FOR ROLE_MOD -->
<sec:authorize access="hasRole('ROLE_MOD')">
        <button class="btn btn-default dropdown-toggle" type="button"
            id="dropdownMenu3" data-toggle="dropdown" aria-haspopup="true"
            aria-expanded="true">
            Account <span class="caret"></span>
        </button>
        <ul class="dropdown-menu" aria-labelledby="dropdownMenu3">
            <li><a href="/messages">Messages</a></li>
            <li><a href="/profile">Profile</a></li>
            <li role="separator" class="divider"></li>
            <li><a href="/suggestnews">Suggest a news</a></li>
            <li><a href="/suggesttutorial">Suggest a tutorial</a></li>
            <li role="separator" class="divider"></li>
            <li><a href="javascript:$('#logoutForm').submit();">Log
                    out</a></li>
        </ul>
</sec:authorize>
  

Комментарии:

1. hasRole отключает ROLE_ интерфейс. Вы используете USER в одном месте, а ROLE_USER в другом.

2. Я изменил это, но все еще не работает.

3. Можете ли вы также поделиться журналом консоли.

4. Ну, я не получаю никаких ошибок с консоли. Единственная ошибка — это белая страница. Страница с ошибкой белой метки В этом приложении нет явного сопоставления для / error, поэтому вы рассматриваете это как запасной вариант. Вс 23 октября 11:08:27 по восточному времени 2016 Произошла непредвиденная ошибка (тип =запрещено, статус = 403). Доступ запрещен

Ответ №1:

Что ж, мне удалось решить мою проблему. Я изменил доступ к профилю, сообщению и выходу из системы. Теперь все аутентифицированные пользователи могут получить к нему доступ.

 @Override
protected void configure(HttpSecurity http) throws Exception {

    //@formatter:off
    http
        .authorizeRequests()
            .antMatchers("/"
                ,"/tutorials"
                ,"/search"
                ,"/about"
                ,"/contact"
                ,"/register",
                "/css/*",
                "/js/*",
                "/img/*")
                    .permitAll()
            .antMatchers(
                "/suggestnews",
                "/suggesttutorial")
                    .hasRole("MOD")
            .antMatchers(
                "/newsmanager",
                "/tutorialsmanager",
                "/usersmanager",
                "/sendemails"
                    .hasRole("ADMIN")
            **.antMatchers(
                "/messages",
                "/profile",
                "/logout")
            .authenticated()**  
                .and()
            .formLogin()
                .loginPage("/login")
                .defaultSuccessUrl("/")
                .permitAll()
                .and()
            .logout()
                .permitAll(); 

        //@formatter:on     
}