我们之前讲解的都是用户的认证,不管是用户名密码验证码登录,短信登录,第三方社交登录。最终目的都是一个:让系统知道到底是谁在访问你的系统。解决核心问题,你是谁? 这一节我们主要研究,你能干什么?针对于你能干什么?有的叫做:授权,有的叫:鉴权。有的叫权限控制?最终目的都是控制你在这个系统能够做什么?
在我们应用系统里面,如果想要控制用户权限,需要有2部分数据。
系统用户发送一个请求:
http://www.a.com/user到应用系... :系统配置信息和用户权限信息作比对,发现 http://www.a.com/user请求需要... ,如果发请求的用户在用户权限信息表中有A权限。那么就可以访问。
当一个系统授权规则比较简单,基本不变时候,系统的权限配置信息可以写在我们的代码里面去的。下面我们通过Spring Security的简单代码配置来实现简单的权限。
配置哪些url只有登录才能访问,哪些url在不登录就可以访问.
authorizeRequests().antMatchers("xxx").permitAll()//指明授权的请求xxx允许不登录访问
.anyRequest().authenticated()//指明所有的请求都需要授权
再区分简单角色的话,我们应该怎样做?
.anyRequest().authenticated()//指明除了上面permitAll()的请求允许访问外,所有的请求都需要授权
那么我们配置用户具备简单角色时候,控制访问呢? 下面指明只有具备:ADMIN角色的用户才具备访问/user的权限。
我们访问: http://localhost :8088/login.html
查询用户1:
也可以访问。
但是我们访问: http://localhost :8088/user出现下面情况:
说明没有权限,那么用户的权限信息是我们如何给的呢?其实是我们的: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
我们尝试访问:
写死url是配置不上的,我们该怎样配置呢?
指明http的get请求/user/*是需要admin权限的。
此时我们可以访问都能访问了。