spring-security 方法访问限制,权限控制

如果权限不足,不能访问某个方法或者页面,会报403错误。

不同方式,方法/页面

  • 在spring-secrity.xml中直接配置

      

       
       

 security:intercept-url是从上往下继续执行,如果上边的pattern通过,下面更精细的pattern不会执行

比如:如果是    
       

      

下面第二条"/role/**"的限制,就完全没有作用,非admin角色也可以访问该方法


 

  • JSR-250

  1. 在spring-security开启开启JSR-250


    

    2.注解,加在方法名上

  • @RolesAllowed表示访问对应方法时所应该具有的角色

        @RolesAllowed({"USER", "ADMIN"}) 该方法只要具有"USER", "ADMIN"任意一种权限就可以访问。这里可以省
略前缀ROLE_,实际的权限可能是ROLE_ADMIN

  • @PermitAll表示允许所有的角色进行访问,也就是说不进行权限控制
  • @DenyAll是和PermitAll相反的,表示无论什么角色都不能访问

 

   //只允许有"ROLE_USER",或者"ROLE_user" 的角色访问
    @RolesAllowed({"USER","user"})
    @RequestMapping("/findAll")
    ModelAndView findAll(){
    //方法体...
    }

 

  •   Secured注解

1.在spring-security开启Secured

2.加在方法名上

@Secured注解标注的方法进行权限控制的支持,其值默认为disabled。

public Account readAccount(Long id);
@Secured("ROLE_TELLER")
 

 

   //只允许有"ROLE_USER",或者"ROLE_user" 的角色访问
    @Secured({"ROLE_USER","ROLE_user"})
    @RequestMapping("/findAll")
    ModelAndView findAll(){
    //方法体...
    }

 


 

  •  支持表达式的注解

1.在spring-security.xml开启

 2.加在方法名上

@PreAuthorize 在方法调用之前,基于表达式的计算结果来限制对方法的访问

@PostAuthorize 允许方法调用,但是如果表达式计算结果为false,将抛出一个安全性异常

@PostFilter 允许方法调用,但必须按照表达式来过滤方法的结果
@PreFilter 允许方法调用,但必须在进入方法之前过滤输入值

 3.记得开启Spring EL表达式(SPEL),在spring-security.xml中进行

  
   

 

@PreAuthorize("#userId == authentication.principal.userId or hasAuthority(‘ADMIN’)")
void changePassword(@P("userId") long userId ){ }

/*
 authentication.principal.userId : 表示当前
这里表示在changePassword方法执行之前,判断方法参数userId的值是否等于principal中保存的当前用户的
userId,或者当前用户是否具有ROLE_ADMIN权限,两种符合其一,就可以访问该方法。

*/


//当前用户是否有ROLE_ADMIN权限
@PreAuthorize("hasRole(‘ROLE_ADMIN’)")
void changePassword( long userId ){ }
//只有tom用户可以进入该方法
@PreAuthorize("authentication.principal.usename == 'tom'")
void changePassword(long userId ){ }

SPEL表达式

描述

hasRole([role])

当前用户是否拥有指定角色。[role]里的多个角色都要有才可以

hasAnyRole([role1,role2])

多个角色是一个以逗号进行分隔的字符串。如果当前用户拥有指定角色中的任意一个则返回true。

hasAuthority([auth])

等同于hasRole

hasAnyAuthority([auth1,auth2])

等同于hasAnyRole

Principle

代表当前用户的principle对象

authentication

直接从SecurityContext获取的当前Authentication对象

permitAll

总是返回true,表示允许所有的

denyAll

总是返回false,表示拒绝所有的

isAnonymous()

当前用户是否是一个匿名用户

isRememberMe()

表示当前用户是否是通过Remember-Me自动登录的

isAuthenticated()

表示当前用户是否已经登录认证成功了。

isFullyAuthenticated()

如果当前用户既不是一个匿名用户,同时又不是通过Remember-Me自动登录的,则返回true。


页面端进行权限控制

  1. 导包


org.springframework.security
spring-security-taglibs
version

2.页面头部导入

<%@taglib uri="http://www.springframework.org/security/tags" prefix="security"%>

3.记得开启Spring EL表达式(SPEL) ,在spring-security.xml中进行

  
   

4.页面内部

authorize 是用来判断普通权限的,通过判断用户是否具有对应的权限而控制其所包含内容的显示

 

//authorize 可以直接写springEL表达式,
//当前表示,只有ADMIN角色的用户才可以看到该项,如果没有权限,不显示authorize标签包含的语句

  • 访问日志
  •  

     authentication

    property: 只允许指定Authentication所拥有的属性,可以进行属性的级联获取,如“principle.username”,
    不允许直接通过方法进行调用
    htmlEscape:表示是否需要将html进行转义。默认为true。
    scope:与var属性一起使用,用于指定存放获取的结果的属性名的作用范围,默认我pageContext。Jsp中拥
    有的作用范围都进行进行指定
    var: 用于指定一个属性名,这样当获取到了authentication的相关信息后会将其以var指定的属性名进行存
    放,默认是存放在pageConext中

    <%-- 插入用户名--%>

     

    你可能感兴趣的:(spring-security,security)