转载

32.SpringSecurity-SpringSecurity授权简介

前言

我们之前讲解的都是用户的认证,不管是用户名密码验证码登录,短信登录,第三方社交登录。最终目的都是一个:让系统知道到底是谁在访问你的系统。解决核心问题,你是谁? 这一节我们主要研究,你能干什么?针对于你能干什么?有的叫做:授权,有的叫:鉴权。有的叫权限控制?最终目的都是控制你在这个系统能够做什么?

内容

1. Spring Security对授权的定义

32.SpringSecurity-SpringSecurity授权简介

  1. 很多人认为权限管理就是:我们的菜单和按钮能不能被人看见。其实能不能被人看见这个事其实不是权限管理的事,原因:不管菜单也好、按钮也好、最终对应的应该都是一个url,你点击一个菜单,可能就事请求了: http://127.0.0.1/server/quest... 。你点击了一个按钮:可能就是发送了一个restful请求: http://127.0.0.1/server/quest...
  2. 不管是菜单或者按钮,对应的都是后端的一个url地址,比如你做一个系统,前端对于菜单和按钮已经隐藏了,看不见了,但是知道你菜单的url,他可以直接去访问菜单对应的url,他仍然可以执行类似菜单和按钮的操作。
  3. 所以控制用户不能看见菜单和按钮其实是没有意义的,你要控制的是不能去访问这些url,不能看见菜单和按钮并不能代表不能访问url。某些用户能不能访问某个url,这个就是安全问题,这个是安全框架和安全模块应该解决的问题。我们的安全问题目前都是通过Spring Security来实现的
  4. 我们控制url能不能访问是安全问题,那么我们控制菜单和按钮能否看见其实是一个用户体验问题。他和系统安不安全没关系,只是一个体验。类似于我们点击一个菜单,然后提示一个"您无权访问这个页面",其实也是用户体验问题,最后还是需要归结到url是否可以被安全访问问题。
  5. 我们安全控制问题其实就是控制能否访问url

32.SpringSecurity-SpringSecurity授权简介

2.Spring Security控制权限

32.SpringSecurity-SpringSecurity授权简介

  1. 一般我们开发互联网应用的时候一般会开发两个系统,一个是业务系统(电商网站-去买东西)---是给普通用户用的、另外一个是内管系统---是给公司运营人员用的(去添加商品,处理订单等)。
  2. 对于以上两个系统而言,对于授权要求不一样,业务系统只区分是否登录或者只区分简单角色,权限规则基本不变。内管系统,角色众多,权限复杂,企业岗位很多,不同岗位权限也是不一样的,权限规则也是随着公司发展而变化的。

32.SpringSecurity-SpringSecurity授权简介

在我们应用系统里面,如果想要控制用户权限,需要有2部分数据。

  1. 系统配置信息数据:写着系统里面有哪些URL,每一个url拥有哪些权限才允许被访问。
  2. 另一份数据就是用户权限信息:请求用户拥有权限

系统用户发送一个请求:

http://www.a.com/user到应用系... :系统配置信息和用户权限信息作比对,发现 http://www.a.com/user请求需要... ,如果发请求的用户在用户权限信息表中有A权限。那么就可以访问。

当一个系统授权规则比较简单,基本不变时候,系统的权限配置信息可以写在我们的代码里面去的。下面我们通过Spring Security的简单代码配置来实现简单的权限。

3. Spring Security控制权限-只区分是否登录

配置哪些url只有登录才能访问,哪些url在不登录就可以访问.

authorizeRequests().antMatchers("xxx").permitAll()//指明授权的请求xxx允许不登录访问
.anyRequest().authenticated()//指明所有的请求都需要授权

4. Spring Security控制权限-区分角色

再区分简单角色的话,我们应该怎样做?

.anyRequest().authenticated()//指明除了上面permitAll()的请求允许访问外,所有的请求都需要授权

那么我们配置用户具备简单角色时候,控制访问呢? 下面指明只有具备:ADMIN角色的用户才具备访问/user的权限。

32.SpringSecurity-SpringSecurity授权简介

我们访问: http://localhost :8088/login.html

32.SpringSecurity-SpringSecurity授权简介

查询用户1:

32.SpringSecurity-SpringSecurity授权简介

也可以访问。

但是我们访问: http://localhost :8088/user出现下面情况:

32.SpringSecurity-SpringSecurity授权简介

说明没有权限,那么用户的权限信息是我们如何给的呢?其实是我们的:MyUserDetailsService里面的:

private SocialUserDetails buildUser(String userId){
        // 根据用户名查找用户信息
        //根据查找到的用户信息判断用户是否被冻结
        String password = passwordEncoder.encode("123456");
        logger.info("数据库密码是:"+password);
        return new SocialUser(userId, password,
                true, true, true, true,
                AuthorityUtils.commaSeparatedStringToAuthorityList("admin,ROLE_USER"));
    }

我们从上面看到最后一个参数就是被授权集合:

public SocialUser(String username, String password, boolean enabled, boolean accountNonExpired, boolean credentialsNonExpired, boolean accountNonLocked, Collection<? extends GrantedAuthority> authorities)

我们修改SocialUserDetails的授权:注意添加前缀ROLE

32.SpringSecurity-SpringSecurity授权简介

我们尝试访问:

32.SpringSecurity-SpringSecurity授权简介

5. Spring Security控制权限-产生问题

  1. 针对于我们的restful API,我们可能针对于同一个url,代表了不同的操作,不同的method; GET /user POST /user
  2. restful api下url表示资源,在我们的url上会有一个变量

32.SpringSecurity-SpringSecurity授权简介

写死url是配置不上的,我们该怎样配置呢?

32.SpringSecurity-SpringSecurity授权简介

指明http的get请求/user/*是需要admin权限的。

此时我们可以访问都能访问了。

原文  https://segmentfault.com/a/1190000022100191
正文到此结束
Loading...