3.4 认证服务查询用户权限
修改认证服务的UserDetailServiceImpl,查询用户的权限,并拼接权限串,将原来硬编码权限代码删除,代码如 下:
[AppleScript] 纯文本查看 复制代码
?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 | ...... / / 请求ucenter查询用户 XcUserExt userext = userClient.getUserext ( username ) ; if ( userext = = null ) { / / 返回NULL表示用户不存在,Spring Security会抛出异常 return null; } / / 从数据库查询用户正确的密码,Spring Security会去比对输入密码的正确性 String password = userext.getPassword ( ) ; / / 指定用户的权限,这里暂时硬编码 List < String > permissionList = new ArrayList < > ( ) ; / / permissionList. add ( "course_get_baseinfo" ) ; / / permissionList. add ( "course_find_pic" ) ; / / 取出用户权限 List < XcMenu > permissions = userext.getPermissions ( ) ; for ( XcMenu xcMenu : permissions ) { permissionList. add ( xcMenu.getCode ( ) ) ; } ...... |
3.5 测试
1、执行登录,在redis中查看jwt令牌,使用jwt测试程序解析jwt令牌中是否包括用户的权限 。
2、使用新的jwt令牌测试方法授权
3、给用户分配新权限,重新生成jwt令牌,测试授权 4 前端集成认证授权
4.1 需求分析
截至目前认证授权服务端的功能已基本完成,本章实现前端集成认证授权功能。
前端集成认证授权功能需要作如下工作:
1、前端页面校验用户的身份,如果用户没有登录则跳转到登录页面
2、前端请求资源服务需要在http header中添加jwt令牌,资源服务根据jwt令牌完成授权。 哪些功能需要前端请求时携带JWT?
用户登录成功请求资源服务都需要携带jwt令牌,因为资源服务已经实现了jwt认证,如果校验头部没有jwt则会认为 身份不合法。
4.2教学管理中心
本节实现教学管理中心实现身份校验,其它前端参考教学管理中心实现。
4.2.1 配置虚拟主机
教学管理前端访问微服务统一在访问地址前添加/api前缀并经过网关转发到微服务。 配置teacher.xuecheng.com虚拟主机。
[AppleScript] 纯文本查看 复制代码
?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #前端教学管理 upstream teacher_server_pool{ server 127.0.0.1:12000 weight=10; } #文件服务 upstream filesystem_server_pool{ server 127.0.0.1:22100 weight=10; } #媒资服务 upstream media_server_pool{ server 127.0.0.1:31400 weight=10; } #学成网教学管理中心 server { listen 80 ; server_name teacher.xuecheng.com; #个人中心 location / { proxy_pass http : / / teacher_server_pool; } location / api { proxy_pass http : / / api_server_pool; } location / filesystem { proxy_pass http : / / filesystem_server_pool; } #媒资管理 location ^ ~ / api / media / { proxy_pass http : / / media_server_pool / media / ; } #认证 location ^ ~ / openapi / auth / { proxy_pass http : / / auth_server_pool / auth / ; } } |
4.2.2身份校验
教学管理中心是单页面应用,我们在路由变化时校验用户的身份,校验失败将跳转到登录页面。
校验方法如下:
1、如果成功从sessionStorage和cookie获取当前用户则继续访问
2、如果sessionStorage中无当前用户,cookie中有当前用户则请求服务端获取jwt,如果成功则继续访问。
3、以上两种情况都不满足则跳转到登录页面。
在main.js中添加路由监控代码,如下:
[AppleScript] 纯文本查看 复制代码
?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | router.beforeEach ( ( to , from , next ) = > { if ( openAuthenticate ) { / / console. log ( to ) / / console. log ( from ) / / * * * * * * * * * * * 身份校验 * * * * * * * * * * * * * * * let activeUser let uid try { activeUser = utilApi.getActiveUser ( ) uid = utilApi.getCookie ( "uid" ) } catch ( e ) { / / alert ( e ) } if ( activeUser & & uid & & uid = = activeUser.uid ) { next ( ) ; } else if ( to . path = = ' / login' || to . path = = ' / logout' ) { next ( ) ; } else if ( uid ) { / / 请求获取jwt systemApi.getjwt ( ) . then ( ( res ) = > { if ( res.success ) { let jwt = res.jwt; let activeUser = utilApi.getUserInfoFromJwt ( jwt ) if ( activeUser ) { utilApi.setUserSession ( "activeUser" , JSON.stringify ( activeUser ) ) } next ( ) ; } else { / / 跳转到统一登陆 window . location = "http://ucenter.xuecheng.com/#/login?returnUrl=" + Base 64. encode ( window . location ) } } ) } else { / / 跳转到统一登陆 window . location = "http://ucenter.xuecheng.com/#/login?returnUrl=" + Base 64. encode ( window . location ) } } else { next ( ) ; } } ) ; |
2、在base/api/system.js中添加getjwt方法
[AppleScript] 纯文本查看 复制代码
?
1 2 | / * 获取jwt令牌 * / export const getjwt = ( ) = > { return http.requestQuickGet ( ' / openapi / auth / userjwt' ) } |