Spring MVC中的安全控制器访问

时间:2019-06-20 10:39:34

标签: spring spring-mvc spring-security

在我的应用程序中,我需要使用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->帐户”功能的用户?

2 个答案:

答案 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 })