用户权限认证(方法级权限认证/路径权限认证) @RolesAllowed,@secured,@preAuthorize注解用法解析笔记

@RolesAllowed JSR250权限控制

  1. 在pom文件导入坐标
        <dependency>
            <groupId>javax.annotationgroupId>
            <artifactId>jsr250-apiartifactId>
            <version>1.0version>
        dependency>
  1. 在spring-security.xml文件中配置开启权限控制

<security:global-method-security jsr250-annotations="enabled" />
  1. 在方法上加注解 @RolesAllowed(“角色名”)
    这样配置,只有角色匹配的用户才可以访问该方法.

@Secured

  1. 在spring-security.xml文件中配置开启权限控制

<security:global-method-security secured-annotations="enabled" />
  1. 在方法上加注解 @Secured (“ROLE_”+“角色名”)
    这样配置,只有角色匹配的用户才可以访问该方法.这种方法需要在角色名前面加上前缀 “ROLE_” 否则不生效;

@PreAuthorize

  1. 在spring-security.xml文件中配置开启权限控制

<security:global-method-security pre-post-annotations="enabled" />
  1. 在方法上加注解 @PreAuthorize()

这种方式可以再括号内写表达式

@PreAuthorize(hasRole(‘ROLE_角色名’))
hasRole(‘角色名’) 返回true 表示可以访问,返回为false 表示不能访问

authentication–令牌对象
principal–用户详情对象
username–属性
@PreAuthorize(authentication.principal.username == ‘tom’)
返回true表示可以访问,返回为false 表示不能访问
这个表达式通过用户登录之后将用户令牌(Token)存储在一个securityContext对象中,这个令牌对象中有用户详情信息,这个注解工作原理就是从这个令牌对象中获得用户信息,在做判断;

url路径检查权限认证

  1. 让自己的 UserInfo 对象实现了 UserDetails 接口,让它包含更全面的信息(角色,权限url)
    原来spring security 自带的User 包含的信息不全(只有角色信息),UserDetails是springSecurity的一个接口.
  2. 自定义检查 url 权限的方法
@Service("securityService")
public class SecurityService {

    // 检查某个 url 是否能够被访问(根据用户权限)
    public boolean accessiable(UsernamePasswordAuthenticationToken authentication, HttpServletRequest request) {
        // 1. 获取当前请求的 url 地址
        String uri = request.getRequestURI(); //   /ssm/user/findAll.do
        String path = request.getContextPath();// 获取虚拟路径
        uri = uri.replace(path, "");

        // 2. 获取用户详情, 因为认证时已经替换为自己的 UserInfo对象了,所以可以强转
        //从底层代码看出UsernamePasswordAuthenticationToken对象将用户详细信息封装进了principal这个属性中;
        UserInfo userInfo = (UserInfo) authentication.getPrincipal();

        // 3. 获取用户所有的 url
        List<String> urls = new ArrayList<>();
        List<Role> roles = userInfo.getRoles();
        for (Role role : roles) {
            List<Permission> permissions = role.getPermissions();
            for (Permission permission : permissions) {
                urls.add(permission.getUrl());
            }
        }

        // 4. 判断是否可以访问
        return urls.contains(uri);
    }
}

3.包扫描,扫描到刚才的securityService,在 spring-security.xml中

<context:component-scan base-package="com.itheima.ssm.security"/>

4.添加 url 路径权限检查


<sec:intercept-url pattern="/user/**" 
  access="isAuthenticated() and @securityService.accessiable(authentication, request)"/>
<sec:intercept-url pattern="/product/**" 
  access="isAuthenticated() and @securityService.accessiable(authentication, request)"/>
<sec:intercept-url pattern="/orders/**" 
  access="isAuthenticated() and @securityService.accessiable(authentication, request)"/>
<sec:intercept-url pattern="/role/**" 
  access="isAuthenticated() and @securityService.accessiable(authentication, request)"/>
<sec:intercept-url pattern="/permission/**"
  access="isAuthenticated() and @securityService.accessiable(authentication, request)"/>


<sec:intercept-url pattern="/**" access="isAuthenticated()"/>

你可能感兴趣的:(用户权限认证(方法级权限认证/路径权限认证) @RolesAllowed,@secured,@preAuthorize注解用法解析笔记)