archive log list权限不足_Spring Security(五):前后端权限控制详解

ad58625056fa0e299d35626a91ebd9fd.png

文章回顾:

  • Spring Security(一):整合JWT实现登录功能
  • Spring Security(二):获取用户权限菜单树
  • Spring Security(三):与Vue.js整合
  • Spring Security(四):更新前端路由获取方式

1、每次请求时,都会带有tokenSpring Security会根据token判断用户信息,进行授权。
2、对于接口权限的控制,我们可以用过使用SpringEL表达式配合@PreAuthorize("hasAnyRole('ADMIN')")注解来对接口进行权限控制,这段注解表示,只有当前用户的角色为ADMIN的时候,Spring Security才会放行。注意:建议使用ROLE_*的方式存放在数据库中用来规定角色名。

    @PreAuthorize("hasAnyRole('ADMIN')")
    @RequestMapping(value = "/getRoleList",method = RequestMethod.POST)
    public RetResult getRoleList(@RequestBody  Map<String,Object> map){
        //...
    }

Example

使用本系统的系统管理员和测试用户分别使用Postman测试,这是测试用户访问进行访问时,会抛出AccessDeniedException权限不足。

dd9d84e6f0ab0262a09b80668cba5d3b.png

使用系统管理员测试结果,可以访问接口获取数据。

7f0bcf018ee64923914fcc5e208b38c9.png

前端权限控制

1、由于本系统采用的是动态加载路由,所以如果当前用户的路由列表中没有你所输入访问的会转到404页面。
2、自定义权限判断方法。配合v-if指令来进行验证。

创建srcutilspermission.js

    import store from '@/store'

    export default function hasPermission(value) {
      if (value && value instanceof Array && value.length > 0) {
        const roles = store.getters && store.getters.roles
        const permissionList = value

        const isPermission = roles.some(role => {
          return permissionList.includes(role.rolename)
        })
        if (!isPermission) {
          return false
        }
        return true
      } else {
        this.$message({
          message: '需要角色权限列表',
          type: 'error'
        })
        return false
      }
    }

解释一下:就是从Vuex中拿到角色,然后与页面中定义的权限角色进行判断,如果包含的话就可以访问。

    <template slot-scope="scope">
      <el-popover
        //在这里使用v-if进行判断就行
        v-if="hasPermission(['ROLE_ADMIN'])"
        :ref="scope.row.id"
        placement="top"
        width="180">
        <p>确定删除本条数据吗?</p>
        <div style="text-align: right; margin: 0">
          <el-button size="mini" type="text" @click="$refs[scope.row.id].doClose()">取消</el-button>
          <el-button :loading="delLoading" type="primary" size="mini" @click="subDelete(scope.row.id)">确定</el-button>
        </div>
        <el-button slot="reference" :disabled="scope.row.id === 1" type="danger" size="mini">删除</el-button>
      </el-popover>
    </template>
    ...

    <script>

    import hasPermission from '@/utils/permission'

    ...

    methods: {
        hasPermission,
    }

这样可以对按钮,或者页面中的一部分页面进行权限控制了~

GitHub分页插件

再说一下Spring Boot中使用Github的分页插件
1、首先引入依赖

    <!--github分页插件-->
    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper-spring-boot-starter</artifactId>
        <version>1.2.3</version>
    </dependency>

2、在application.yml中配置PageHelper如下

    pagehelper:
      helperDialect: mysql
      reasonable: true
      supportMethodsArguments: true
      params: count=countSql

3、建议封装一个PageUtil,原因是通常Vue前端分页需要我们传递当前页:pageNum,页大小:pageSize,总数量pageTotal等参数。

    package com.example.security.util;

    import com.github.pagehelper.Page;
    import lombok.Data;

    import java.util.List;

    /**
     * @Autoor:杨文彬
     * @Date:2019/1/21
     * @Description:
     */
    @Data
    public class PageUtil {
        private Integer pageCur;
        private Integer pageSize;
        private Integer rowTotal;
        private Integer pageTotal;
        private List data;

        public PageUtil(Page page,List data) {
            this.pageCur = page.getPageNum();
            this.pageSize = page.getPageSize();
            this.rowTotal = page.getPages();
            this.pageTotal = Integer.valueOf((int)page.getTotal());
            this.data = data;
        }
    }

返回数据的格式

7f0bcf018ee64923914fcc5e208b38c9.png

然后在前端渲染数据就ok了。目前做了角色管理页面,其中也对角色操作一栏使用hasPermission进行了权限控制。代码已经同步到Github上了,如果你有任何的建议欢迎联系我~

欢迎关注我的个人微信公众号~

c5a15d1364c967bdd38a3b48e42e8cd8.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值