在我的应用程序中,我需要使用Spring Security保护控制器访问权限
尤其是,我想允许/禁止基于授权的用户访问所有控制器方法。
以下是Controller的示例:
@Controller
@RequestMapping("${path.myapp}" + "/accounts")
public class AccountsController extends AbstractCrudController<AccountsBean, Long> {
...
}
在我的应用程序中,每个用户都有一个功能列表(在与USER-> FUNCTIONALITY相关联的数据库表中定义)。用户也具有角色,但是具有相同角色的用户可以使用不同的功能。
启动应用程序并且用户登录后,我阅读了与用户链接的所有功能,并且正确显示/隐藏了菜单项。
这是一堆jsp:
<sec:authorize access="hasAnyRole('Anagrafica -> Accounts')" >
<li id="accounts"><a href="${anagraficaPath}/accounts/index.html"><fmt:message key="menu.anagrafica.accounts"/></a></li>
<li class="divider"></li>
</sec:authorize>
我如何保护此Controller,以拒绝不具有“ Anagrafica->帐户”功能的用户?
答案 0 :(得分:0)
您可以在扩展WebSecurityConfigurerAdapter的安全配置类中保护URI。 https://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#oauth2login-provide-websecurityconfigureradapter
例如
Configuration
@EnableWebSecurity
public class MySecConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests().mvcMatchers("${anagraficaPath}/accounts/*")
.hasAnyRole("'Anagrafica -> Accounts'");
您甚至可以将标签更改为: 然后,它将使用您在配置类中定义的相同规则。
此外,如果您可以启用方法级别的注释,并且可以在控制器中的方法上使用PreAuthorize,例如
@PreAuthorize("hasRole('Anagrafica -> Accounts')")
public void myControllerMethod() {
答案 1 :(得分:0)
要保护特定控制器,您需要在其上方使用@PreAuthorize注释,如下所示:
@PreAuthorize("hasAuthority('"Anagrafica -> Accounts"')")
public ResponseEntity<T> getAll(){}
OR
@PreAuthorize("hasRole('"Anagrafica -> Accounts"')")
public ResponseEntity<T> getAll(){}
注意:@PreAuthorize注释是方法级别的,而不是类级别的,因为PreAuthorize包含@Target({ ElementType.METHOD, ElementType.TYPE })
。