SpringBoot廿SpringBoot中整合Shiro实现权限管理_第1页
SpringBoot廿SpringBoot中整合Shiro实现权限管理_第2页
SpringBoot廿SpringBoot中整合Shiro实现权限管理_第3页
SpringBoot廿SpringBoot中整合Shiro实现权限管理_第4页
SpringBoot廿SpringBoot中整合Shiro实现权限管理_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、SpringBoot廿三、SpringBoot 中整合 Shiro 实现权限管理2020-07-12 16:53:31之前在SSM项目中使用过shiro,发现shiro的权限管理做的真不错,但是在SSM 项目中的配置太繁杂了,于是这次在SpringBoot中使用了 shiro,下面一起看看 吧一、简介Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会 话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从 最小的移动应用程序到最大的网络和企业应用程序。三个核心组件:1、Subject即“当前操作用户”。但是,在Shiro中,Sub

2、ject这一概念并不仅仅指人,也可以是 第三方进程、后台帐户(DaemonAccount)或其他类似事物。它仅仅意味着当前 跟软件交互的东西。Subject代表了当前用户的安全操作,SecurityManager则管 理所有用户的安全操作。2、SecurityManager它是Shiro框架的核心,典型的Facade模式,Shiro通过SecurityManager来管理 内部组件实例,并通过它来提供安全管理的各种服务。3、RealmRealm充当了 Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说,当对用 户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Rea

3、lm中 查找用户及其权限信息。从这个意义上讲,Realm实质上是一个安全相关的DA0: 它封装了数据源的连接细节,并在需要时将相关数据提供给Shiro。当配置Shiro 时,你必须至少指定一个Realm,用于认证和(或)授权。配置多个Realm是可 以的,但是至少需要一个。Shiro内置了可以连接大量安全数据源(乂名日录)的 Realm,如LDAP、关系数据库(JDBC)、类似INI的文本配置资源以及属性文件 等。如果缺省的Realm不能满足需求,你还可以插入代表自定义数据源的自己的 Realm实现。二、整合 shiro4引入maven依赖 ! - web 支持org sp”ingframew

4、ork bootspTing-boot-starter-weborg sp”ingframework bootspringboot-starter-thymeleafv/antifactldorg apache shiroartifacin g1.24com.githubtheborakompanioni/groupldthymeleaf-extras-shirxx/a”tifactld2.00我使用的SpringBoot版本是2.3.1,其它依赖自己看着引入吧2、创建shiro配置文件关于shiro的配置信息,我们都放在ShiroConfig.java文件中import at polluxt

5、hymeleaf shiro dialect ShiroDialect;import org apache shiro authc credentialHashedCredentialsMatcher;import org apache shiromgt SecurityManage”;import org.apache.shiro.spring.LifecycleBeanPostProcesso”;import org.apache.shiro.spring.securityinterceptor.AuthorizationAttrib uteSourceAdvisor;import org

6、.apache.shino.spring.web.ShinoFiltenFactoryBean;import org apache shirowebmgt DefaultWebSecurityManager;import ong springframework aop framework autoproxy DefaultAdvisorAutoPr oxyCreator;import org springframework contextannotation Bean;import org springframework contextannotationConfiguration;impor

7、t org springframework context annotation DependsOn;import java.util.LinkedHashMap;import java.util.Map;* shiro配置类*/Configurationpublic class ShiroConfig /*注入这个是是为了在thymeleaf中使用shiro的口定义tag。*/Bean(name = shiroDialect) public ShiroDialect shiroDialect() return new ShiroDialect();/*地址过滤器* param securit

8、yManage”* return*/Beanpublic ShiroFilterFactoryBean shiroFilterFactonyBean(SecurityManage r securityManage”) ShiroFilterFactonyBean shiroFilterFactoryBean = new ShiroFilten FactoryBean();/ 设置 securityManagershiroFi It erFac toryBea n. set SecurityMa/设置登录u shiroFiIterFactoryBean.setLoginUrl(/login);/

9、设置主页url shiroFiIterFactonyBean.setSuccessUrlC/);/设置未授权的urlshiroF ilt erFac tonyBea n. set Unau 七110广匚20111广.(/11 nauthonized);Map filterChainDefinitionMap = new LinkedHashMa P();/开放登录接口filterChainDefinitionMap.put(/doLogin, anon);/开放静态资源文件 filterChainDefinitionMap.put(/css/anon); filterChainDefiniti

10、onMap.put(/img/*M, anon); filterChainDefinitionMap.put(/js/* anon); filterChainDefinitionMap.put(,/layui/*, anon);/其余url全部拦截,必须放在最后 filterChainDefinitionMap.put(,7* authc); shiroFiIterFactoryBean.setFilterChainDefinitionMap(fiIterChainD efinitionMap);return shiroFilterFactoyBean;* 口定义安全管理策略*/Beanpub

11、lic SecurityManager securityManager() DefaultWebSecurityManage” securityManager = new DefaultWebSecur ityManager();/*设置自定义的relam*/securityManager.setRealm(loginRelam(); return securityManagen;/*登录验证*/Beanpublic LoginRelam loginRelam() return new LoginRelam();*以下是为了能够使用RequiresPermission()等标签*/Beanpu

12、blic DefauItAdvisorAutoProxyCreator advisorAut0卩厂0乂(031:0() DefauItAdvisorAutoProxyCreator advisorAutoProxyCreato” = new De faultAdvisorAu 七0卩0%。“081:0广();advisorAutoProxyCreaton.setProxyTargetClass(tnue); return advisorAutoProxyCreator;Beanpublic static LifecycleBeanPostProcesso” lifecycleBeanPostP

13、rocesso” ()return new LifecycleBeanPostProcessoO;Beanpublic AuthorizationAttribu七0$011“。6人1/150广 authorizationAttributeSo urceAdvisor() AuthorizationAttributeSourceAdviso” authorizationAttributeSounc eAdvisor = new AuthorizationAttributeSourceAdvisor();authorizationAttributeSourceAdviso”.setSecurity

14、Manager(security Manager();return authorizationAttributeSouTceAdvisor;上面开放静态资源文件,其它博客说的是*filterChainDefinitionMap. put (/stat Hanonu);*,但我发现,我们在html文件中引入静态文件时,请求路径根 本没有经过static, thymeleaf 口动默认配置*static/*下面就是静态资源文件, 所以,我们开放静态资源文件需要指定响应的目录路径2、登录验证管理关于登录验证的一些逻辑,以及赋权等操作,我们都放在LoginRelamJava文件中import com

15、baomidoumybatisplus core conditions query QueryWrapper; import com zyxx sbm entityUserlnfo;import comzyxxsbm.serviceRolePenmissionService;import com zyxx sbm service UserlnfoService;import com zyxx sbm service UserRoleService;import org.apache.shino.authc*;import org apache shiro authc credentialCre

16、dentialsMatcher;import org.apache.shino.authz.Authorizationlnfo;import org apache shiro authzSimpleAuthonizationlnfo;import org apache shiro realmAuthorizingRealm;import org apache shiro subject PrincipalCollection;import org apache shiro util ByteSource;import org springframework beans factony anno

17、tation Autowired;import java.util.Set;*登录授权*/public class LoginRelam extends AuthorizingRealm Autowiredprivate UserlnfoService userlnfoService;Autowiredprivate UserRoleService userRoleService;Autowired private RolePermissionService rolePermissionService;*身份认证* param authenticationToken* return* thro

18、ws AuthenticationException*/Overrideprotected Authenticationinfo doGetAuthenticationlnfo(AuthenticationToken authenticationToken) throws AuthenticationException /获取基用户名和密码的令牌:实际上这个authcToken是从LoginContr oiler 里面 currentuser. login(token)传过來的UsernamePasswodToken token 二(Use”namePasswordToken) authent

19、ic ationToken;根据用户名查找到用户信息QueryWrapper queryWrapper = new QueryWrapper(); queryWrappereq(account tokengetUsername();Userinfo userInfo = userlnfoServicegetOneCqueryWrapper);/没找到帐号if (null 二二 userInfo) throw new UnknownAccountException();/校验用户状态if (I.equals(userinfo.getStatus() throw new DisabledAccou

20、ntException();/认证缓存信息return new SimpleAuthenticationlnfo(userlnfo, userlnfo.getPassw ord() ByteSourceUtilbytes(userinfo.getAccount(), getName();/*角色授权* param principalCollection* return*/Overrideprotected Authorizationlnfo doGetAuthorizationlnfo(PrincipalCollect ion pnincipalCollection) Userinfo aut

21、horizingUse” = (Userlnfo) principalCollection.getP” imaryPrincipal();if (null != authorizingUsen) /权限信息对象info,用來存放査出的用户的所有的角色(role)及权限(permission)SimpleAuthorizationInfo simpleAuthordzationlnfo = new Simpl eAuthorizationlnfo();获得用户角色列表Set roleSigns = userRoleService.listUsenRoleByUserl d(authonizing

22、User getld();SimpleAuthorizationInfo.addRoles(roleSigns);/获得权限列表Set permissionSigns = rolePermissionService.listRol ePermissionByUserId(authorizingUsengetld();simpleAuthorizationInfo.addStringPermissions(permissionSign s);retu“n simpleAuthorizationlnfo;return null;/*自定义加密规则* param credentialsMatche”

23、*/Overridepublic void setCredentialsMatcher(C“edentialsMatchen credentialsMat cher) /自定义认证加密方式CustomCredentialsMatche” customCedentialsMatche = new CustomC redentialsMatche“();/设置自定义认证加密方式super setCnede ntialsMa;以上就是登录时,需要指明shiro对用户的一些验证、授权等操作,还有自定义密 码验证规则,在笫3步会讲到,获取角色列表,权限列表,需要获取到角色与权 限的标识,每一个角色,每一

24、个权限都有唯一的标识,装入Set中3、自定义密码验证规则密码的验证规则,我们放在了 CustomCredentialsMatcher.java文件中import org apache shiro authc Authenticationlnfo;import ong apache shiroauthc AuthenticationToken;import org.apache.shiro.authc.UsernamePasswordToken;import ong apache shiro authc credentialSimpleCredentialsMatcher;import orga

25、pacheshirocryptohashSimpleHash;/* ClassName CustomOedentialsMatcher*自定义密码加密规则* Author Lizhou* Date 2020-07-10 16:24:24* /public class CustomCredentialsMatcher extends SimpleCredentialsMatcherOverridepublic boolean doCredentialsMatch(AuthenticationToken authcToken? A uthenticationlnfo info) UsernameP

26、asswordToken token = (UsernamePasswordToken) authcToke n;加密类型,密码,盐值,迭代次数Object tokenCredentials = new SimpleHash(md5J token.getPasswo “d() token.getUsername(力 6).toHex();/数据库存储密码Object accountCnedentials = getCredentials(info);/将密码加密与系统加密后的密码校验,内容一致就返回true,不一致就返回 falsereturn equals(tokenCredentials,

27、 accountCredentials);我们采用的密码加密方式为MD5加密,加密6次,使用登录账户作为加密密码的 盐进行加密4、密码加密工具上面我们自定义了密码加密规则,我们创建一个密码加密的工具类PasswordUtils.java 文件import org apache shiro crypto hashMd5Hash;/*密码加密的处理工具类*/public class Passwordlltils /*迭代次数*/private static final int ITERATIONS = 6;private PasswordUtils() throw new AssertionErr

28、or();/*字符串加密函数MD5实现* param password 密码* param loginName 用户名* return*/public static String getPassword(String passwords String loginName)return new Md5Hash(password? loginName ITERATIONS).toString();上面,我们已经配置了 shiro的一系列操作,从登录验证、密码验证规则、用户授 权等等,下面我们就开始登录,登录的操作,放在了 Logincontroller.java文件中 import com zyx

29、x commonconsts SystemConst;import com mon enums StatusEnums; import com mon kaptcha.KaptchaUtil;import com mon shiroSingletonLoginUtils;import mon utilsPasswordlltiIs;import com mon utils ResponseResult;import com zyxx.sbm entityUserinfo;import comzyxx.sbm.servicePermissionInfoSenvice;import io.swag

30、ger.annotationsApi;import io.swagger.annotationsApilmplicitParam;import io.swagger.annotationsApilmplicitParams;import io swagger annotations ApiOperation;import org.apache.shiro.SecurityUtiIs;import org.apache.shiro.authc*;import org.apache.shiro.subjectSubject;import ong springframework beans fact

31、o“y annotation Autowired; import org springframework stereotype Controller;import org springframework web.bind annotation GetMapping; import ong springframework web bindannotation PostMapping; import org springframework web.bind annotation ResponseBody;import javaxservlethttpHttpServletRequest; impo

32、rt javax servlet http HttpServletResponse;/* ClassName LoginController* Description* Author Lizhou* Date 2020-07-02 10:54:54 Api(tags二“后台管理端一登录”)Controllerpublic class LoginController Autowiredprivate PermissionlnfoService permissionInfoService;ApiOperation(value =请求登录页面notes =请求登录页面)GetMapping(logi

33、n)public String init() return login;ApiOperation(value =请求主页面notes =请求主页面)GetMapping(*7 )public String index() return index;ApiOperation(value =登录验证,notes =登录验证)ApiImplicitParams(ApiImplicitParam(name = account value =账号J require d = true),ApiImplic it Param (n ame = password value =密 fi 马requir ed

34、= true)ApiImplicitParam(name = resCode value =验证码笃 requi red = true),ApiImplicitParam(name = rememberMe1, value =记住登录,r equired = true)PostMapping( l,doLoginH)ResponseBodypublic ResponseResult doLogin(Strying account. String password, Stri ng resCode Boolean rememberMe HttpServletRequest request Htt

35、pServlet Response response) throws Exception /验证码if (!Kaptchallti 1validate(resCode,request) retunn ResponseResultgetlnstance()error(StatusEnumsKAPTCH_ERROR);/验证帐号和密码Subject subject 二 SecurityUtils.getSubject();UsernamePasswordToken token 二 new UsernamePasswordToken(account, password);/记住登录状态token s

36、etRememberMe(rememberMe);Wy /执行登录subject login(token);/将用户保存至j session中Userinfo userInfo = (UserInfo) subjectgetPrincipal(); request.getSession().setAttribute(SystemConst.SYSTEM_USER_S ESSION, userinfo);retunn ResponseResultgetInstance()success(); catch (UnknownAccountException e) return ResponseResult .getInstance().error(账户不存在11); catch (DisabledAccountException e) return ResponseResult .getInstance().error(账户已被冻结”); catch (IncorrectCredentialsException e) return R

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论