IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Spring security method 方法级别的权限控制

    asuncool@gmail.com(yihaomen)发表于 2015-11-17 22:30:30
    love 0
    以前用spring security 做过url级别的权限控制,但一些简单的应用应该可以满足了,一些复杂的应用,权限是到方法级别的。花了一点时间看了一下,要做到method级别的控制通过简单的配置也可以做到.

    1. 首先得修改 配置文件, 比如spring-security.xml。允许  @PreAuthorize和@PostAuthorize注解.
    程序代码 程序代码

    <global-method-security pre-post-annotations="enabled" />


    这些注解接受一个参数,要么是角色名称,要么是表达式. 如果你设置的是 use-e­xpression 为 true , 将会采用表达式. 否则将会直接用 角色名称.

    2. 在要保护的方法上加上注解
    程序代码 程序代码

    ...
    @Repository
    public class EmployeeDaoImpl implements EmployeeDAO  {

        @Autowired
        private SessionFactory sessionFactory;

        // 注意这里方法保护,按角色.
        @PreAuthorize("hasRole('ROLE_ADMIN')")
        @Override
        public void addEmployee(EmployeeEntity employee) {
            //System.out.println(((User)SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getAuthorities());
            this.sessionFactory.getCurrentSession().save(employee);
        }

        @SuppressWarnings("unchecked")
        @Override
        public List<EmployeeEntity> getAllEmployees() {
            return this.sessionFactory.getCurrentSession().createQuery("from Employee").list();
        }
    ...


    3. 运行程序,登陆测试。
    如果是普通用户登陆,添加用户,报错 403 没有权限
    如果是管理员登陆之后,就可以正常添加用户.

    例子用到的数据脚本如下:
    程序代码 程序代码

    Create TABLE `employee` (
    `ID` int(11) NOT NULL AUTO_INCREMENT,
    `FIRSTNAME` varchar(30) DEFAULT NULL,
    `LASTNAME` varchar(30) DEFAULT NULL,
    `TELEPHONE` varchar(15) DEFAULT NULL,
    `EMAIL` varchar(30) DEFAULT NULL,
    `CreateD` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`ID`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;


    程序代码demo 下载:
    下载文件 spring security method demo download


沪ICP备19023445号-2号
友情链接