Springboot+Shiro实现登录

Shiro的简单介绍

Shiro是Java的一个安全框架,旨在简化身份验证和授权。Shiro在JavaSE和JavaEE项目中都可以使用。它主要用来处理身份认证,授权,企业会话管理和加密等。

shiro由三部分组成:

1、Subject:当前操作的用户就是当前登录的用户;

2、SecurityMapper:该组件用来管理所有操作用户的安全操作

3、Realm:该组件需要自己来定义,shiro当前登录的账号、密码是否正确,并且其拥有那些权限

Shiro实现登录

1、pom文件配置

        <!--shiro  用于登录--><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version>1.4.2</version></dependency><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.4.2</version></dependency>

2、创建realm包下的UserRealm类,

使其继承AuthorZingReal类,并在该UserRealm类下实现AuthorZingReal中的doGetAuthenticationInfo()和doGetAuthorizationInfo()方法 认证和授权

//认证
@Override
protected AuthenticationInfo doGetAuthenticationInfo(Authentication token) throws Exception{//获取用户QueryWapper<User> wapper=new QueryWapper<>();wapper.eq("username",token.getPrincipal.toString());User user=userService.getOne(wapper);//进行判断if(user!=null){//三个参数:账号、密码、用户名SimpleAuthentication simpleAuthenticationInfo=new SimpleAuthentication(user,user.getPassword,this.getName());return simpleAuthenticationInfo;}return null;
}//授权protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {return null;}

3、创建对应的configl类——ShiroConfig

@Configuration
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass(value = { SecurityManager.class })
@ConfigurationProperties(prefix = "shiro")
@Data
public class ShiroConfig {private static final String SHIRO_DIALECT = "shiroDialect";private static final String SHIRO_FILTER = "shiroFilter";// 加密方式private String hashAlgorithmName = "md5";// 散列次数private int hashIterations = 2;// 默认的登陆页面private String loginUrl = "/index.html";private String[] anonUrls; // 放行的路径private String logOutUrl; // 登出的地址private String[] authcUlrs; // 拦截的路径/*** 声明凭证匹配器*//*@Bean("credentialsMatcher")public HashedCredentialsMatcher hashedCredentialsMatcher() {HashedCredentialsMatcher credentialsMatcher = new HashedCredentialsMatcher();credentialsMatcher.setHashAlgorithmName(hashAlgorithmName);credentialsMatcher.setHashIterations(hashIterations);return credentialsMatcher;}*//*** 声明userRealm*/@Bean("userRealm")public UserRealm userRealm() {UserRealm userRealm = new UserRealm();return userRealm;}/*** 配置SecurityManager*/@Bean("securityManager")public SecurityManager securityManager(UserRealm userRealm) {DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();// 注入userRealmsecurityManager.setRealm(userRealm);return securityManager;}/*** 配置shiro的过滤器*/@Bean(SHIRO_FILTER)public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();// 设置安全管理器factoryBean.setSecurityManager(securityManager);// 设置未登陆的时要跳转的页面factoryBean.setLoginUrl(loginUrl);Map<String, String> filterChainDefinitionMap = new HashMap<>();// 设置放行的路径if (anonUrls != null && anonUrls.length > 0) {for (String anon : anonUrls) {filterChainDefinitionMap.put(anon, "anon");}}// 设置登出的路径if (null != logOutUrl) {filterChainDefinitionMap.put(logOutUrl, "logout");}// 设置拦截的路径if (authcUlrs != null && authcUlrs.length > 0) {for (String authc : authcUlrs) {filterChainDefinitionMap.put(authc, "authc");}}Map<String, Filter> filters=new HashMap<>();factoryBean.setFilters(filters);factoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);return factoryBean;}/*** 注册shiro的委托过滤器,相当于之前在web.xml里面配置的* @return*/@Beanpublic FilterRegistrationBean<DelegatingFilterProxy> delegatingFilterProxy() {FilterRegistrationBean<DelegatingFilterProxy> filterRegistrationBean = new FilterRegistrationBean<DelegatingFilterProxy>();DelegatingFilterProxy proxy = new DelegatingFilterProxy();proxy.setTargetFilterLifecycle(true);proxy.setTargetBeanName(SHIRO_FILTER);filterRegistrationBean.setFilter(proxy);return filterRegistrationBean;}/* 加入注解的使用,不加入这个注解不生效--开始 *//**** @param securityManager* @return*/@Beanpublic AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);return authorizationAttributeSourceAdvisor;}@Beanpublic DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator() {DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();advisorAutoProxyCreator.setProxyTargetClass(true);return advisorAutoProxyCreator;}/* 加入注解的使用,不加入这个注解不生效--结束 *//*** 这里是为了能在html页面引用shiro标签,上面两个函数必须添加,不然会报错** @return*/@Bean(name = SHIRO_DIALECT)public ShiroDialect shiroDialect() {return new ShiroDialect();}}

这里基本不用改变,最重要的就是这三个路径:

private String[] anonUrls; // 放行的路径
private String logOutUrl; // 登出的地址
private String[] authcUlrs; // 拦截的路径

4、在yml文件中进行配置

#shiro的配置
shiro:anon-urls:    #放行路径- /toLogin*- /login.html*- /login/login- /login/getCode- /css/**- /echarts/**- /images/**- /layui/**- /layui_ext/**- /js/**login-url: /index.html     log-out-url: /login/logout*   #登出路径authc-ulrs:                 #拦截路径- /**

5、在controller中进行登录和登出设置

//shiro登录
Subject subject = SecurityUtil.getSubject();
UsernamePasswordToken token=new UsernameToken(username,password);
subject.login(token);
User user=(User)suject.getPrincipal();
//shiro登出
@RequestMapping("/login/logout")
@ResponseBodypublic String logout(){Subject subject=SecurityUtil.getSubject();suject.logout();return "longin";  //返回到登录页面
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/706640.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【御控物联】物联网协议

文章目录 一、前言二、协议清单三、技术资料 一、前言 如果一个人想要和全球各个国家贸易&#xff0c;那这个人就得懂各个国家的语言或者全球通用语言&#xff0c;同样&#xff0c;在物联网的世界里&#xff0c;各家设备也都拥有自己的语言&#xff08;协议&#xff09;&#…

Go语言不再难!跟随ChatGPT轻松攻克编程难关

开发人员&#xff08;包括我在内&#xff09;通常偏好边学习边实践的方式。这不仅仅是我与LLM协作的核心准则之一&#xff0c;也是最关键的准则&#xff1a;因为你是在任务导向的学习过程中积累知识&#xff0c;这种学习方式不是预先的——它基于实时的、可感知的情境。 当资深…

Spring-Cloud 微服务

1. 微服务架构 1.1 单体应用架构---内部项目【OA WMS等】 将项目所有模块(功能)打成jar或者war&#xff0c;然后部署一个进程 优点: 1:部署简单:由于是完整的结构体&#xff0c;可以直接部署在一个服务器上即可。 2:技术单一:项目不需要复杂的技术栈&#xff0c;往往一套熟悉的…

单片机烧录程序时“DTR的低电平复位,RTS高电平进入bootloader”有关的串口Modem联络信号

烧录程序时常见DTR和RTS引脚 参考&#xff0c;参考视频 因为常常使用的都是串口下载程序&#xff0c;常用的芯片CH340系列&#xff0c;下图中标红的引脚是MODEM联络信号&#xff0c;其中常见的DTR和RTS就是常见的串口Modem网络输出信号&#xff0c;也就是通过烧录软件控制的接…

【数据结构】排序(直接插入排序,希尔排序)

目录 一、排序的概念 二、常见的排序算法 三、插入排序 1.直接插入排序 1.直接插入排序实现 2.直接插入排序特性及复杂度 2.希尔排序 1.排序思路 2.希尔排序实现 3.希尔排序的特性及复杂度 一、排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#x…

怎么转换视频格式到mp4?格式转换,4种简单方法

转换视频格式到MP4可以使视频在各种设备上播放更加方便&#xff0c;而MP4格式的优势在于其高质量的视频和相对较小的文件大小。怎么转换视频格式到mp4&#xff1f;在本文中&#xff0c;我们将介绍四种简单有效的方法&#xff0c;帮助您快速将视频格式转换为MP4。 无论您是初学…

【介绍下Python多线程,什么是Python多线程】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

【网络安全】【Frida实战案例】某图xx付费功能逆向分析(一)

文章目录 一、目标应用二、环境三、步骤1、查看布局id2、用到的Log日志类信息3、尝试hook VIP判断方法 四、总结五、相关源码 1、【网络安全】【Frida实践案例】某图xx付费功能逆向分析&#xff08;一&#xff09; 2、【网络安全】【Frida实践案例】某图xx付费功能逆向分析&…

全国老年大学或将进入“5G智慧校园“时代

近日&#xff0c;我国晚年大学协会在北京举行官网改版上线典礼&#xff0c;一起这也标志着我国晚年大学协会及全国晚年大学进入了“5G智慧校园”年代。据了解&#xff0c;5G智慧校园以“云”技能为根底&#xff0c;全面落实数字云、办理云、安全云。 “三朵云”助推5G智慧校园&…

团结引擎+OpenHarmony 记录 (持续更新中)

1 TuanjiePlayerAbility.ts 中获取 content 引用 globalThis.AbilityContext 在 TuanjiePlayerAbility.ts 中是可以获取到的 但是在 tslib 或者中 globalThis.AbilityContext 是无法获取到的GetFromGlobalThis(‘AbilityContext’); 同样 在 TuanjiePlayerAbility.ts 中是可以…

通配符SSL证书获取与安装教程

一、通配符SSL证书简介 通配符SSL证书&#xff08;既泛域名SSL证书&#xff09;是一种特殊的SSL证书类型&#xff0c;它允许你使用一个证书来保护同一个主域名下的所有子域名。这意味着&#xff0c;无论你的网站有多少个子域名&#xff08;如blog.example.com, shop.example.co…

JL-杰理芯片-认识TA的SDK的第四天

无蓝牙连接关机时间 关机时间&#xff1a;3分钟 60 * 5 300 低功耗 进入低功耗前&#xff0c;要关闭打印 内存D2、D4、D8 芯片&#xff08;主控&#xff09;的内存不能超过一定的数值&#xff0c;超过后就不能烧录 jl_isd.bin这个文件不能超过内存大小 而杰理的内存是…