#java #spring #spring-boot #spring-security
#java #весна #весенняя загрузка #spring-безопасность
Вопрос:
Мне было интересно, как разрешить разным ролям видеть определенные кнопки боковой панели в зависимости от их роли, используя spring boot 5. У меня есть АДМИНИСТРАТОР и ПОЛЬЗОВАТЕЛЬ, мой администратор должен иметь возможность видеть кнопку «Управление людьми» на боковой панели, в то время как обычный ПОЛЬЗОВАТЕЛЬ ничего не увидит на этой боковой панели.
sideBar.html
<security:authorize access="hasAuthority('ROLE_ADMIN')">
<li class="nav-item"><a class="nav-link collapsed"
href="#"
data-toggle="collapse" data-target="#collapseMenu" aria-expanded="true"
aria-controls="collapseMU"> </i>
<span> <b>Manage People</b>
</span>
</a></li>
<!-- sub-menu -->
<div id="collapseMenu" class="collapse">
<li class="nav-item"><a class="nav-link collapsed" href="#"
data-toggle="collapse" data-target="#collapseGroup"
aria-expanded="true" aria-controls="collapseGroup"></i>
<span>Show User Group</span>
</a>
</div>
</security:authorize>
SecConfig.java (часть этого)
protected void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity.csrf().and().authorizeRequests().antMatchers("/").permitAll()
antMatchers("/landing")
.access("(hasAnyRole('ADMIN')
.anyRequest()
.authenticated()
.and()
.formLogin()
.loginPage("/")
.successHandler(loginSuccessHandler())
.failureHandler(loginFailedHandler())
.permitAll().and().logout().permitAll();
}
Я попытался добавить
<security:authorize access="hasAuthority('ADMIN')">
в sideBar.html но ПОЛЬЗОВАТЕЛЬСКАЯ страница по-прежнему может видеть кнопку «Управление людьми» на боковой панели.
Есть ли что-то, что я делаю неправильно?
Я новичок в этом. Спасибо: 3
Ответ №1:
Если вы используете движок Thymeleaf, в Spring Security module интегрирован диалект «sec». Вот подробности
По ссылке:
Атрибут sec:authorize отображает его содержимое, когда выражение атрибута оценивается как true:
<div sec:authorize="isAuthenticated()">
This content is only shown to authenticated users.
</div>
<div sec:authorize="hasRole('ROLE_ADMIN')">
This content is only shown to administrators.
</div>
<div sec:authorize="hasRole('ROLE_USER')">
This content is only shown to users.
</div>
Имейте в виду, что вам нужно будет включить пространство имен безопасности Thymeleaf в корневой тег перед его использованием:
xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4"
Ответ №2:
Атрибут sec:authorize отображает его содержимое, когда выражение атрибута оценивается как true:
<div sec:authorize="isAuthenticated()">
<!-- The Content under this is visible when the user is login with any ROLE -->
</div>
<div sec:authorize="hasRole('ROLE_ADMIN')">
<!-- The content under this is visible when login user is ADMIN-->
</div>
<div sec:authorize="hasRole('ROLE_USER')">
<!-- The content under this is visible when login user has role 'USER' -->
</div>
Ответ №3:
Обязательно добавьте это в свой тег thymeleaf
xmlns:security="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5"
Кроме того, добавьте зависимость ниже в свой pom.xml файл:
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-springsecurity5</artifactId>
</dependency>
Ответ №4:
Сначала вы проверяете, аутентифицирован ли пользователь, а затем проверяете, является ли его роль администратором, а затем отображаете содержимое, т.е
<div sec:authorize="isAuthenticated()">
<div sec:authorize="hasRole('ROLE_ADMIN')">
<li class="nav-item"><a class="nav-link collapsed"
href="#"
data-toggle="collapse" data-target="#collapseMenu" aria-expanded="true"
aria-controls="collapseMU"> </i>
<span> <b>Manage People</b>
</span>
</a></li>
<!-- sub-menu -->
<div id="collapseMenu" class="collapse">
<li class="nav-item"><a class="nav-link collapsed" href="#"
data-toggle="collapse" data-target="#collapseGroup"
aria-expanded="true" aria-controls="collapseGroup"></i>
<span>Show User Group</span>
</a>
</div>
</div>
</div>