专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

从零开始,手打一个权限管理系统(第五章权限控制)

  前言
  这章主要通过SpringSecurity来实现对权限的控制,权限粒度是到每个方法。一、token验证
  第四章登录我们获取到了token,每次请求的时候都必须验证这个token是否合法、是否过期,所以我们需要一个拦截器来拦截每一次的请求;这里我们可以通过继承OncePerRequestFilter来实现我们对token的验证;当然并不是所有请求都需要拦截,所以还需要一个白名单,来配置不需要被拦截的请求。Slf4jConfigurationConfigurationProperties(prefixsecurity。white)publicclassPermitUrlProperties{GetterSetterprivateListStringurlsnewArrayList();}
  yml配置:security:white:urls:loginlogout
  JwtAuthenticationTokenFiltertoken拦截验证Slf4jpublicclassJwtAuthenticationTokenFilterextendsOncePerRequestFilter{AutowiredprivateJWTUtiljwtUtil;AutowiredprivatePermitUrlPropertiespermitUrlProperties;OverrideprotectedvoidinitFilterBean()throwsServletException{System。out。println(JwtAuthenticationTokenFilter初始化。。。);}OverrideprotectedvoiddoFilterInternal(HttpServletRequesthttpServletRequest,HttpServletResponsehttpServletResponse,FilterChainfilterChain)throwsServletException,IOException{StringrequestUrlhttpServletRequest。getRequestURI();log。info(请求url:{},requestUrl);白名单url放过if(filterWhiteUrl(requestUrl)){filterChain。doFilter(httpServletRequest,httpServletResponse);return;}StringauthTokenhttpServletRequest。getHeader(SecurityConstants。AUTHORIZATION);if(StrUtil。isBlank(authToken)){ResultStringresultResult。fail();result。setMsg(未登录);ResponseUtil。response(httpServletResponse,result);return;}booleancheckTokenjwtUtil。checkToken(authToken);if(checkToken){ResultStringresultResult。fail();result。setMsg(会话已过期,请重新登录);httpServletResponse。setStatus(HttpStatus。HTTPUNAUTHORIZED);ResponseUtil。response(httpServletResponse,result);return;}if(SecurityContextHolder。getContext()。getAuthentication()null){Context中的认证为空,进行token验证ClaimsclaimsjwtUtil。getClaimsFromToken(authToken);从jwt中恢复用户信息和权限Stringidclaims。get(JWTUtil。ID,String。class);StringorgIdclaims。get(JWTUtil。ORGID,String。class);Stringusernameclaims。get(JWTUtil。USERNAME,String。class);Stringauthoritiesclaims。get(JWTUtil。AUTHORITIES,String。class);ListStringlistJSON。parseObject(authorities,newTypeReferenceListString(){});JwtUserjwtUsernewJwtUser(id,orgId,username,,AuthorityUtils。createAuthorityList(list。toArray(newString〔0〕)));如username不为空,并且能够在数据库中查到JwtAuthenticationTokenjwtAuthenticationTokennewJwtAuthenticationToken(jwtUser。getAuthorities(),jwtUser,null);将authentication放入SecurityContextHolder中SecurityContextHolder。getContext()。setAuthentication(jwtAuthenticationToken);}filterChain。doFilter(httpServletRequest,httpServletResponse);}过滤表名单的urlparamurlreturnprivatebooleanfilterWhiteUrl(Stringurl){ListStringwhiteListpermitUrlProperties。getUrls();if(CollectionUtil。isNotEmpty(whiteList)){PathMatchermatchernewAntPathMatcher();for(StringreleaseUrl:whiteList){booleanmatchmatcher。match(releaseUrl,url);if(match){returntrue;}}}returnfalse;}}
  更新下SpringSecurityConfigurer,将JwtAuthenticationTokenFilter加入配置中,部分代码如下:http。addFilterAfter(jwtAuthenticationTokenFilter(),UsernamePasswordAuthenticationFilter。class);BeanJwtAuthenticationTokenFilterjwtAuthenticationTokenFilter(){returnnewJwtAuthenticationTokenFilter();}
  经过一系列的编译调试后,启动项目验证:
  1、获取token
  2、不带token访问主页
  3、带token访问主页
  4、token错误和过期访问主页
  二、权限验证1、开启全局安全配置
  在SpringSecurityConfigurer上加上EnableGlobalMethodSecurity(prePostEnabledtrue)就可以了;他会解锁PreAuthorize和PostAuthorize两个注解,PreAuthorize会在方法执行前进行验证,PostAuthorize会在方法执行后进行验证。2、标记需要校验的方法
  我们在IndexController上面加上权限校验,即PreAuthorize(hasAuthority(sys:index))
  3、自定义未授权处理器
  实现AccessDeniedHandler的handle接口即可
  JwtAccessDeniedHandler未授权访问处理publicclassJwtAccessDeniedHandlerimplementsAccessDeniedHandler{Overridepublicvoidhandle(HttpServletRequesthttpServletRequest,HttpServletResponsehttpServletResponse,AccessDeniedExceptione)throwsIOException,ServletException{ResultStringresultResult。fail(e。getMessage());httpServletResponse。setStatus(HttpStatus。HTTPFORBIDDEN);ResponseUtil。response(httpServletResponse,result);}}
  把这个加到SpringSecurityConfigurer里面,新增代码如下:。exceptionHandling((execption)execption未授权异常处理。accessDeniedHandler(newJwtAccessDeniedHandler()));
  测试未授权
  测试已授权
  在JwtUserDetailsServiceImpl的权限列表中加入我们刚刚加的权限标记sys:index
  重新登录,获取新的token,并请求主页,发现能够正常访问
  3、通过数据库配置权限
  前面都是写死的权限,实际项目都是从数据库中查询的,这个项目我们采用RBAC基于角色的访问控制,将所有权限都赋给角色,将角色赋给具体的用户。3。1、表设计
  用户表sysuser,用来存放用户名、密码等基础信息CREATETABLEsysuser(idvarchar(32)CHARACTERSETutf8mb4COLLATEutf8mb4binNOTNULLCOMMENT主键ID,usernamevarchar(64)CHARACTERSETutf8mb4COLLATEutf8mb4binNOTNULLCOMMENT用户名,passwordvarchar(255)CHARACTERSETutf8mb4COLLATEutf8mb4binNOTNULL,phonevarchar(20)CHARACTERSETutf8mb4COLLATEutf8mb4binNULLDEFAULTNULLCOMMENT电话,avatarvarchar(255)CHARACTERSETutf8mb4COLLATEutf8mb4binNULLDEFAULTNULLCOMMENT头像,orgidvarchar(32)CHARACTERSETutf8mb4COLLATEutf8mb4binNULLDEFAULTNULLCOMMENT机构ID,createtimetimestampNULLDEFAULTCURRENTTIMESTAMPCOMMENT创建时间,updatetimetimestampNULLDEFAULTCURRENTTIMESTAMPONUPDATECURRENTTIMESTAMPCOMMENT修改时间,statuschar(1)CHARACTERSETutf8mb4COLLATEutf8mb4binNULLDEFAULT1COMMENT1正常,0锁定,delflagchar(1)CHARACTERSETutf8mb4COLLATEutf8mb4binNULLDEFAULT1COMMENT逻辑删除标记(1:显示;0:删除),PRIMARYKEY(id)USINGBTREE,UNIQUEINDEXukusername(username)USINGBTREE)ENGINEInnoDBCHARACTERSETutf8mb4COLLATEutf8mb4binCOMMENT用户表ROWFORMATDynamic;
  组织机构表sysorgCREATETABLEsysorg(idvarchar(32)CHARACTERSETutf8mb4COLLATEutf8mb40900aiciNOTNULL,parentidvarchar(32)CHARACTERSETutf8COLLATEutf8generalciNULLDEFAULTNULL,sortintNULLDEFAULT1COMMENT排序,typechar(2)CHARACTERSETutf8mb4COLLATEutf8mb40900aiciNOTNULLCOMMENT机构类型,codevarchar(32)CHARACTERSETutf8mb4COLLATEutf8mb40900aiciNOTNULLCOMMENT机构编码,namevarchar(50)CHARACTERSETutf8COLLATEutf8generalciNULLDEFAULTNULLCOMMENT机构名称,phonevarchar(20)CHARACTERSETutf8mb4COLLATEutf8mb40900aiciNULLDEFAULTNULLCOMMENT电话,emailvarchar(32)CHARACTERSETutf8mb4COLLATEutf8mb40900aiciNULLDEFAULTNULLCOMMENT邮箱,addressvarchar(500)CHARACTERSETutf8mb4COLLATEutf8mb40900aiciNULLDEFAULTNULLCOMMENT地址,remarksvarchar(255)CHARACTERSETutf8mb4COLLATEutf8mb40900aiciNULLDEFAULTNULLCOMMENT备注,delflagchar(1)CHARACTERSETutf8COLLATEutf8generalciNULLDEFAULT1COMMENT逻辑删除标记(1:显示;0:删除),statuschar(2)CHARACTERSETutf8mb4COLLATEutf8mb40900aiciNULLDEFAULTNULLCOMMENT1:正常,0:锁定,createtimetimestampNULLDEFAULTCURRENTTIMESTAMPCOMMENT创建时间,updatetimetimestampNULLDEFAULTNULLONUPDATECURRENTTIMESTAMPCOMMENT修改时间,PRIMARYKEY(id)USINGBTREE)ENGINEInnoDBCHARACTERSETutf8mb4COLLATEutf8mb40900aiciCOMMENT机构管理ROWFORMATDynamic;
  菜单表sysmenu,存放对应的菜单和权限标识CREATETABLEsysmenu(idvarchar(32)CHARACTERSETutf8COLLATEutf8generalciNOTNULLCOMMENT菜单ID,titlevarchar(32)CHARACTERSETutf8COLLATEutf8generalciNOTNULLCOMMENT菜单名称,permissionvarchar(64)CHARACTERSETutf8COLLATEutf8generalciNULLDEFAULTNULLCOMMENT权限标识,parentidvarchar(32)CHARACTERSETutf8COLLATEutf8generalciNULLDEFAULTNULLCOMMENT父菜单ID,sortintNOTNULLDEFAULT0COMMENT排序值,typechar(1)CHARACTERSETutf8COLLATEutf8generalciNULLDEFAULTNULLCOMMENT菜单类型(0菜单1按钮),createtimetimestampNOTNULLDEFAULTCURRENTTIMESTAMPCOMMENT创建时间,updatetimetimestampNOTNULLDEFAULTCURRENTTIMESTAMPONUPDATECURRENTTIMESTAMPCOMMENT更新时间,delflagchar(1)CHARACTERSETutf8COLLATEutf8generalciNULLDEFAULT1COMMENT逻辑删除标记(1:显示;0:删除),PRIMARYKEY(id)USINGBTREE)ENGINEInnoDBCHARACTERSETutf8COLLATEutf8generalciCOMMENT菜单权限表ROWFORMATDynamic;
  角色表sysroleCREATETABLEsysrole(idvarchar(32)CHARACTERSETutf8mb4COLLATEutf8mb4binNOTNULLCOMMENT主键,rolenamevarchar(64)CHARACTERSETutf8mb4COLLATEutf8mb4binNOTNULLCOMMENT角色名,rolecodevarchar(64)CHARACTERSETutf8mb4COLLATEutf8mb4binNOTNULLCOMMENT角色编码,roledescvarchar(255)CHARACTERSETutf8mb4COLLATEutf8mb4binNULLDEFAULTNULLCOMMENT角色描述,createtimetimestampNOTNULLDEFAULTCURRENTTIMESTAMPCOMMENT创建时间,updatetimetimestampNULLDEFAULTNULLONUPDATECURRENTTIMESTAMPCOMMENT修改时间,delflagchar(1)CHARACTERSETutf8mb4COLLATEutf8mb4binNULLDEFAULT1COMMENT逻辑删除标记(1:显示;0:删除),PRIMARYKEY(id)USINGBTREE,UNIQUEINDEXroleidrolecode(rolecode)USINGBTREE)ENGINEInnoDBCHARACTERSETutf8mb4COLLATEutf8mb4binCOMMENT系统角色表ROWFORMATDynamic;
  角色菜单关系表sysrolemenu,一个角色拥有哪些菜单的权限CREATETABLEsysrolemenu(roleidvarchar(32)CHARACTERSETutf8COLLATEutf8generalciNOTNULLCOMMENT角色ID,menuidvarchar(32)CHARACTERSETutf8COLLATEutf8generalciNOTNULLCOMMENT菜单ID,createtimetimestampNULLDEFAULTCURRENTTIMESTAMPCOMMENT创建时间,PRIMARYKEY(roleid,menuid)USINGBTREE)ENGINEInnoDBCHARACTERSETutf8COLLATEutf8generalciCOMMENT角色菜单表ROWFORMATDynamic;
  用户角色表sysuserrole,一个用户拥有哪些角色CREATETABLEsysuserrole(useridvarchar(32)CHARACTERSETutf8COLLATEutf8generalciNOTNULLCOMMENT用户ID,roleidvarchar(32)CHARACTERSETutf8COLLATEutf8generalciNOTNULLCOMMENT角色ID,createtimetimestampNULLDEFAULTCURRENTTIMESTAMPCOMMENT创建时间,PRIMARYKEY(userid,roleid)USINGBTREE)ENGINEInnoDBCHARACTERSETutf8COLLATEutf8generalciCOMMENT用户角色表ROWFORMATDynamic;
  用户和角色是一对多的关系,角色和菜单也是一对多的关系
  3。2、创建实体和实现CRUD
  写这些类其实是一个重复的工作,把这个项目写完了,一定要做一个代码生成器,一个一个地敲太费时费力了!!
  4、测试验证4。1、初始化数据
  之前我们开启了权限验证,现在初始化数据的时候先关一下;只需要注释掉SpringSecurityConfigurer上的EnableGlobalMethodSecurity(prePostEnabledtrue)这个注即可。
  接口文档:从零开始手打一个权限管理系统
  初始化菜单数据
  取消注释,发送登录请求,可以发现权限信息已经全部写进去了,大家会发现新生成的token会比之前大很多,因为写入了权限信息,具体代码可看JWTUtil的createToken方法
  测试访问没有权限的主页
  测试有权限的用户新增
  看看能不能登录
  到这里,这个系统的基本功能大部分都完成了,接下来我将继续完善和优化细节!!!
  当前版本:1。0。4
  〔代码仓库〕(https:gitee。comailotstudy)三、体验地址(http:test。ailot。vip)
  后台数据库只给了部分权限,报错属于正常!想学的老铁给点点关注吧!!!后期会开源前后端所有代码!!!
  我是阿咕噜,一个从互联网慢慢上岸的程序员,如果喜欢我的文章,记得帮忙点个赞哟,谢谢!

甘肃名人(五)卓尼土司杨氏父子为中国革命做出的突出贡献头条创作挑战赛甘肃是个多民族聚居的地区,历史上自明代起就建立了土司制度,让有威望的少数民族首领担任一方土司,代替中央王朝维护地方的安定。甘肃卓尼杨土司始祖些地就是在明成祖朱棣永乐十空闲舱位!船只装不满货了?载货量急剧下降船公司闲置船只以阻止下跌黄金周假期结束后,来自中国的集装箱现货运费和短期运费仍面临压力,因为需求低迷迫使远洋运输公司撤出更多运力。载货率低于70据业内一份报告显示,本10月18日金属现货价格铝价锌价镍价钢铁10月14日SMM金属现货报价httpsnews。smm。cnnews10197427810月下旬供应趋紧支撑铜价关注宏观政策指引9月,沪铜处于窄幅震荡,整体走势偏稳,月度波幅跌12022款iPadPro最快在19日凌晨发布,或取消发布会据外媒MarkGurman最新报道,苹果公司计划在本周二(美国时间10月18日)宣布推出采用M2芯片的2022新款iPadPro。这也就意味着,苹果最快在19日凌晨(北京时间)发布大出水量,净热一体,352大通量净水器A418H的使用体验和选购意见作为一个智能家居服务行业的从业者,352第一款净水器产品S100的老用户,有幸提前体验了新品A418H。本文力求用最干货的文字,反馈一下我对A418H的使用认知和选购意见。末端净水双十一有什么实用好物推荐,超实用的几款双十一好物一年一度的双十一有快要到了,都说科技改变生活,现在市面上的数码产品也越来越多,很多小伙伴都要忍不住剁手了,但是我觉得购物还是要理性的,要根据自己的需求去入手,今天我给大家推荐几款双美的海尔TCL神仙打架!为什么只有TCL复式洗衣机做出6公斤上筒?这两年复式分区洗衣机越打越火热,尤其的是以TCL海尔等为代表的大品牌,更是不断推动技术升级,带给消费者极具产品力的新品。如今,自带柔烘功能的双子洗衣机更是成为市场的香饽饽,成为精致国产芯片SoC崛起!群雄逐鹿,鹿死谁手?作者星空下的锅包肉编辑菠菜的星空排版星空下的芋圆2021年,全球缺芯。在国产替代的趋势下,国内芯片企业的业绩迎来了前所未有的增长。SoC龙头全志科技(300458),去年实现扣非净骨传导耳机百元新旗舰南卡RunnerCC3骨传导耳机内存版体验跟随音乐节拍而动,一款靠谱的耳机听歌那是必须的,最近入手了一款有着高性价比且佩戴舒适的骨传导耳机,它就是南卡RunnerCC3骨传导耳机,运动中舒适无感佩戴,听歌不入耳也让运动时的信徒3。5亿,影响整个东亚,起源古印度的佛教为何被赶出印度?有个冷知识世界三大宗教,其实都起源于亚洲。其中,基督教起源于西亚,信徒遍布欧洲美洲和大洋洲。伊斯兰教起源于阿拉伯半岛,信徒辐射到亚非两大洲。而佛教起源于古印度,信徒绝大多数分布在东岁月无恙,只言温暖,不语悲伤因为无常,所以要善待生命因为因果,所以要善待他人因为轮回,所以要善待人生。人生没有完美,幸福没有满分,这烟火人间,事事遗憾,事事也值得。岁月静好,带着知足的心生活,带着感恩的心看世
嘉庆病逝遗诏丢失,道光却顺利登基,皇后为何不让自己的儿子继位1820年七月二十五日下午嘉庆帝病情急剧恶化,已经不能开口说话,只能用手比划着,告诉托津戴军元两位心腹大臣赶紧找诏书但是托津二人不仅摸遍了嘉庆帝全身,还将嘉庆帝随身携带的十几个大箱与清朝皇帝血缘关系比较近的皇族还有哪些2015年,金友之先生辞世,中国唯一在世的与清朝皇帝血缘关系最近的皇族也离开了人世。金友之,谱名溥任,是摄政王載灃的小儿子末代皇帝溥儀同父异母的亲弟弟!除了与溥儀一母同胞的溥傑之外刺杀皇帝这件事,不但有高风险,而且没高回报,自然就没人去做引言为什么古代皇帝很少死于刺杀?首先,很多人都在纠结各种情况算不算刺杀,那为什么不先去搞清楚刺杀的定义呢?刺杀刺而杀之,利用计谋施诈于对方用武器暗中杀害。暗中杀害指趁人不备杀之,知徐凤年和母亲被软禁当质子,结识以后的皇帝赵铸,一直称他小乞儿徐凤年的童年也有着一段黑暗时光,那时候的他不是什么世子殿下,只是一个被软禁在丹铜关的质子那时离阳已从一个北方小国崛起,以奔雷之势迅速吃掉几个小国,一跃成为坐拥整个北方的大国。此时朝长垣县各乡镇名称的来历长垣在战国时期名首垣,属魏。长垣首垣是因县有防垣,故县氏之。防垣即防御敌国入侵的城郭。战国军事要地首垣在魏国的东北部,是魏国防御齐赵两国入侵的要塞。魏惠王十七年(前354年),由孙如意甘肃复产复工智慧文旅勇做先锋12项活动助推甘肃文旅市场加速复苏冬日花开腊梅香,暖阳融化眉头霜。连日来,甘肃省文化和旅游厅为全面激活全省文化旅游市场,频频出招,动作不断制定下发关于进一步提振发展信心加快全省文旅行业复工复产的通知和加快复苏全省文不丹王室闪耀亮相国庆!不丹王后穿紫色传统服饰好嫩,公主好惊艳12月17日是不丹的国庆,当天,不丹王室齐聚国庆庆祝活动,不丹王后吉增佩玛一身紫色传统服饰亮相,这次两个儿子也都来了,不丹国王一家四口很是养眼。不丹老国王的四个妻子也都齐到场,四位天水市与甘肃省国投集团举行座谈会新天水讯记者王琴12月16日下午,天水市与甘肃省国有资产投资集团有限公司举行座谈会,双方就进一步深化合作进行深入交流。市委书记冯文戈,省国投集团党委书记董事长成广平出席会议并讲话。西班牙17岁未来女王穿粉色好嫩比莱蒂齐亚美,一出生就拯救王室2022年10月,西班牙的未来女王莱昂诺尔,和自己的家人们一同出席了一场音乐会。只见17岁的莱昂诺尔穿着一件玫粉色的西装套装,用黑色衬衣打底,一头无敌遮脸卷发披散下来,在镜头下白到钱氏吴越历代国君吴越(907年978年),五代十国之一,由钱镠建立,定都杭州。吴越先后尊后梁后唐后晋后汉后周和北宋中原王朝为正朔。后梁建立,钱镠以拥戴之功,封为吴越王。钱镠一边向中朝称臣,一边自立薛仁贵征东中战力出众的五人,薛仁贵排第三,第一是谁?说唐后传的故事分为两部分,前面一小部分是罗通扫北,后面大部分是薛仁贵征东。这两个故事虽然合在一处,实际上完全是可以独立出来的。在罗通扫北之时,前几员武将主要是罗仁铁雷八宝罗通铁雷银
友情链接:快好知快生活快百科快传网中准网文好找聚热点快软网