springboot怎么整合shiro实现权限控制-mile米乐体育
springboot怎么整合shiro实现权限控制
这篇文章主要介绍“springboot怎么整合shiro实现权限控制”,在日常操作中,相信很多人在springboot怎么整合shiro实现权限控制问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”springboot怎么整合shiro实现权限控制”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
1、springboot整合shiro
apache shiro是一个强大且易用的java安全框架,执行身份验证、授权、密码和会话管理。
1.1、shiro简介
shiro有个核心组件,分别为subject、securitymanager和realms
subject:相当于当前操作的”用户“,这个用户不一定是一个具体的人,是一个抽象的概念,表明的是和当前程序进行交互的任何东西,例如爬虫、脚本、等等。所有的subject都绑定到securitymanager上,与 subject 的所有交互都会委托给 securitymanager;可以把 subject 认为是一个门面;securitymanager 才是实际的执行者。
securitymanager:这个是shiro框架的核心,所有与安全相关的操作都会与它进行交互,它管理者所有的subject。
realms:充当了shiro与应用安全数据间的”桥梁“,当对用户执行认证(登录)和授权(访问控制)验证时,securitymanager 需要从 realm 获取相应的用户进行比较以确定用户身份是否合法;也需要从 realm 得到用户相应的角色 / 权限进行验证用户是否能进行操作。
1.2、代码的具体实现
1.2.1、maven的配置
shiro默认是与jsp进行使用的,而这里是shiro整合thymeleaf所有要导入shiro整合thymeleaf的jar包
1.2.2、整合需要实现的类
一般来说整合只需要完成两个类的实现即可
一个是 shiroconfig 一个是 customerrealm
如果需要添加shiro缓存并且不是自带的缓存而是redis缓存还需要进行另外两个类的编写
一个是 rediscache 一个是 rediscachemanager
1.2.3、项目结构
1.2.4、shiroconfig的实现
未加shiro的缓存
packagecom.yuwen.config;importat.pollux.thymeleaf.shiro.dialect.shirodialect;importcom.yuwen.shiro.cache.rediscachemanager;importcom.yuwen.shiro.realm.customerrealm;importorg.apache.shiro.authc.credential.hashedcredentialsmatcher;importorg.apache.shiro.realm.realm;importorg.apache.shiro.spring.web.shirofilterfactorybean;importorg.apache.shiro.web.mgt.defaultwebsecuritymanager;importorg.springframework.beans.factory.annotation.qualifier;importorg.springframework.context.annotation.bean;importorg.springframework.context.annotation.configuration;importjava.util.hashmap;importjava.util.map;@configurationpublicclassshiroconfig{//让页面shiro标签生效@beanpublicshirodialectshirodialect(){returnnewshirodialect();}//1、创建shirofilter负责拦截所有请求@beanpublicshirofilterfactorybeanshirofilterfactorybean(defaultwebsecuritymanagerdefaultwebsecuritymanager){shirofilterfactorybeanfactorybean=newshirofilterfactorybean();//给filter设置安全管理factorybean.setsecuritymanager(defaultwebsecuritymanager);//配置系统的受限资源//配置系统公共资源全部都能访问的设置anonmap
因为一般在数据库中设置明文密码不安全,所有我这里对密码进行了md5加密,我的加密方式为:密码 = 密码 盐 散列次数 而后进行md5加密 所以这里创建自定义的realm时需要进行设置匹配器这样登录时密码才能匹配成功
1.2.5、customerrealm的实现
packagecom.yuwen.shiro.realm;importcom.yuwen.pojo.user;importcom.yuwen.pojo.vo.viewperms;importcom.yuwen.pojo.vo.viewrole;importcom.yuwen.service.userservice;importcom.yuwen.shiro.salt.mybytesource;importorg.apache.shiro.authc.authenticationexception;importorg.apache.shiro.authc.authenticationinfo;importorg.apache.shiro.authc.authenticationtoken;importorg.apache.shiro.authc.simpleauthenticationinfo;importorg.apache.shiro.authz.authorizationinfo;importorg.apache.shiro.authz.simpleauthorizationinfo;importorg.apache.shiro.realm.authorizingrealm;importorg.apache.shiro.subject.principalcollection;importorg.apache.shiro.util.collectionutils;importorg.springframework.util.objectutils;importjavax.annotation.resource;importjava.util.list;//自定义realmpublicclasscustomerrealmextendsauthorizingrealm{@resourceprivateuserserviceuserservice;//授权@overrideprotectedauthorizationinfodogetauthorizationinfo(principalcollectionprincipalcollection){//获取身份信息stringprimaryprincipal=(string)principalcollection.getprimaryprincipal();//根据主身份信息获取角色和权限信息list
在登录时会自动调用这个身份验证 在验证时如果出错,会报异常,我在controller层接收了异常并处理
controller层中登录时的异常处理
@postmapping("/login")publicstringlogin(stringusername,stringpassword){//获取主体对象subjectsubject=securityutils.getsubject();try{//自动调用customerrealm类中的身份验证方法subject.login(newusernamepasswordtoken(username,password));return"index";}catch(unknownaccountexceptione){//接收异常并处理e.printstacktrace();model.addattribute("msg","用户名有误,请重新登录");}catch(incorrectcredentialsexceptione){//接收异常并处理e.printstacktrace();model.addattribute("msg","密码有误,请重新登录");}return"login";}
1.2.6、shiro缓存配置
定义了shiro缓存,用户登录后,其用户信息、拥有的角色 / 权限不必每次去查,这样可以提高效率
默认缓存的配置
在 shiroconfig中 的 getrealm() 方法中开启缓存管理
@beanpublicrealmgetrealm(){customerrealmcustomerrealm=newcustomerrealm();//开启缓存管理customerrealm.setcachemanager(newehcachemanager());//开启全局缓存customerrealm.setcachingenabled(true);//开启认证缓存customerrealm.setauthenticationcachingenabled(true);customerrealm.setauthenticationcachename("authenticationcache");//开启权限缓存customerrealm.setauthorizationcachingenabled(true);customerrealm.setauthorizationcachename("authorizationcache");returncustomerrealm;}
与reids整合的缓存这里就不说明了,放在源码里自己查看,源码在下方
1.2.7、mile米乐体育主页index.html的设置
在这里用标签来判断某些区域需要认证或什么角色或者什么权限才能访问
显示认证通过内容
没有认证时显示
admin角色显示
具有用户模块的"user:*:*"权限显示
1.3、简单测试
1.3.1、admin角色所有权限测试
1.3.2、无角色有权限测试
1.3.3、无角色无权限测试
到此,关于“springboot怎么整合shiro实现权限控制”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注恰卡编程网网站,小编会继续努力为大家带来更多实用的文章!