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

@RolesAllowed JSR250权限控制

  1. 在pom文件导入坐标
        <dependency>
            <groupId>javax.annotation</groupId>
            <artifactId>jsr250-api</artifactId>
            <version>1.0</version>
        </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 路径权限检查

<!-- 对于controller 路径,做【认证 + url 路径权限】

* isAuthenticated() :判断是否认证(是否成功登录),如果认证了,再检查url是否合法
* @securityService.accessiable:是调用 securityService 的方法做 url 路径权限检查
* @securityService.accessiable(authentication, request)括号中的参数必须是这两个,要与上面的securityService对应
-->
<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()"/>
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

干饭两斤半

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值