spring boot 认证 授权开发过程中随笔

2018-09-14  本文已影响81人  shoage

刚接触后台开发不久,就把一些工作过程中遇到小白问题啰里啰嗦的写下来

1.web ignore比较适合配置前端相关的静态资源,它是完全绕过spring security的所有filter的;

而permitAll,会给没有登录的用户适配一个AnonymousAuthenticationToken,设置到SecurityContextHolder,方便后面的filter可以统一处理authentication。

2.在已经支持用户名,密码认证的情况下,实现手机号+短信验证码认证登录

我们知道,spring auth2.0框架里,OAuth2AccessToken是在TokenEndpoint里的postAccessToken方法里产生的,该方法有注解@RequestMapping(value = "/oauth/token", method=RequestMethod.POST),先来看看这个产生方法

2.1 根据源码剖析postAccessToken

postAccessToken方法有两个参数,一个是Principal类型,这是跟ClientDetailsService相关的信息,根据Principal,ClientDetailsService里调用loadClientByClientId方法可以得到ClientDetails(也就是客户端一些信息,比如android端、ios端、pc管理系统等等),ClientDetails是OAuth2RequestFactory生成TokenRequest要用到的,TokenRequest又是用来干嘛的?当然是用来生成OAuth2AccessToken用的,看看里面最为关键的一句代码  OAuth2AccessToken token = getTokenGranter().grant(tokenRequest.getGrantType(), tokenRequest);,是不是用到了TokenRequest

另外一个参数是Map<String, String>类型 parameters,这个map一般包含了auth2.0框架支持的一些鉴权方式(code类型、password类型等)grant_type,权限范围scope(read write等),密码认证时用户名和密码也储存在这个map里面,这个map跟第一个参数讲解里产生的ClientDetails,生成TokenRequest,参考代码 TokenRequest tokenRequest = getOAuth2RequestFactory().createTokenRequest(parameters, authenticatedClient);

上述就是postAccessToken方法的参数及作用的讲解,讲解过程中,又出现了两个陌生的家伙grant_type和OAuth2RequestFactory

2.2 根据源码剖析createTokenRequest

该方法是类DefaultOAuth2RequestFactory的一个实例方法,输出tokenRequest 对象,两个参数就是2.1提到的ClientDetails和parameters,关键代码TokenRequest tokenRequest = new TokenRequest(requestParameters, clientId, scopes, grantType);requestParameters也就是参数parameters,clientId首先在parameters找是否有client_id字段,有就取client_id对应的值,没有则调用ClientDetails实例的getClientId()方法,这就是为什么自定义的ORM实体类必须实现auth2.0指定的一些接口的原因,如客户端信息按auth2.0标准建好数据库表(表名假设为clients)后,假设你自己定义ORM实体类别为Client,则Client必须要实现auth2.0指定的跟客户端信息相关的接口,也就是接口ClientDetails,这样才能在此步骤得到clientId参数;scopes:也是先看parameters里的scope字段,没有则用ClientDetails里的scope值;grantType也即是parameters里面的grant_type字段,这里看来parameters必然要带上grant_type字段,否则会抛出空指针异常。

2.3 根据源码剖析grant方法

该方法是接口TokenGranter的方法,那么纵观全局,有两个疑问,一个是在TokenEndpoint里,到底是哪个实现了TokenGranter的grant方法,另一个就是TokenEndpoint里的clientDetailsService是如何被设置成我们自己定义的CustomClientDetailsService呢

上一篇下一篇

猜你喜欢

热点阅读