springboot如何整合shiro实现登录验证授权的过程解析
发表于:2024-12-13 作者:千家信息网编辑
千家信息网最后更新 2024年12月13日,本篇文章为大家展示了springboot如何整合shiro实现登录验证授权的过程解析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。springboot整合sh
千家信息网最后更新 2024年12月13日springboot如何整合shiro实现登录验证授权的过程解析
本篇文章为大家展示了springboot如何整合shiro实现登录验证授权的过程解析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
springboot整合shiro实现登录验证授权,内容如下所示:
1.添加依赖:
org.apache.shiro shiro-spring 1.7.1
2.yml配置:
#配置服务端口server: port: 8080 servlet: encoding: charset: utf-8 enabled: true force: true context-path: /cxh/spring: #配置数据源 datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/cxh_mall_service?characterEncoding=utf-8&useSSL=false username: root password: 123456 #配置页面 mvc: view: prefix: /WEB-INF/page/ suffix: .jsp #配置上传文件大小 servlet: multipart: max-file-size: 10MB#配置Mybatismybatis: config-location: classpath:mybatis/mybatis-config.xml mapper-locations: classpath:mybatis/mapper/*.xml type-aliases-package: com.cxh.mall.entity
3.shiro配置:
import org.apache.shiro.authc.credential.HashedCredentialsMatcher;import org.apache.shiro.mgt.SecurityManager;import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;import org.apache.shiro.spring.web.ShiroFilterFactoryBean;import org.apache.shiro.web.mgt.DefaultWebSecurityManager;import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import java.util.HashMap;import java.util.Map;@Configurationpublic class ShiroConfig { @Bean @ConditionalOnMissingBean public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() { DefaultAdvisorAutoProxyCreator defaultAAP = new DefaultAdvisorAutoProxyCreator(); defaultAAP.setProxyTargetClass(true); return defaultAAP; } //凭证匹配器, 密码校验交给Shiro的SimpleAuthenticationInfo进行处理 public HashedCredentialsMatcher hashedCredentialsMatcher() { HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher(); hashedCredentialsMatcher.setHashAlgorithmName("MD5");//散列算法:这里使用MD5算法; hashedCredentialsMatcher.setHashIterations(2);//散列的次数; return hashedCredentialsMatcher; //将自己的验证方式加入容器 public LoginRealm myShiroRealm() { LoginRealm loginRealm = new LoginRealm(); //加入密码管理 loginRealm.setCredentialsMatcher(hashedCredentialsMatcher()); return loginRealm; //权限管理,配置主要是Realm的管理认证 public SecurityManager securityManager() { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(myShiroRealm()); return securityManager; //Filter工厂,设置对应的过滤条件和跳转条件 public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) { ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); shiroFilterFactoryBean.setSecurityManager(securityManager); Mapmap = new HashMap<>(); //登出 map.put("/logout", "logout"); //登录 map.put("/loginSubmit", "anon"); //静态文件包 map.put("/res/**", "anon"); //对所有用户认证 map.put("/**", "authc"); shiroFilterFactoryBean.setLoginUrl("/login"); //首页 shiroFilterFactoryBean.setSuccessUrl("/index"); //错误页面,认证不通过跳转 shiroFilterFactoryBean.setUnauthorizedUrl("/error"); shiroFilterFactoryBean.setFilterChainDefinitionMap(map); return shiroFilterFactoryBean; public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) { AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor(); authorizationAttributeSourceAdvisor.setSecurityManager(securityManager); return authorizationAttributeSourceAdvisor;}
4.shiro登录验证授权:
import com.cxh.mall.entity.SysUser;import com.cxh.mall.service.SysMenuService;import com.cxh.mall.service.SysRoleService;import com.cxh.mall.service.SysUserService;import org.apache.shiro.authc.*;import org.apache.shiro.authz.AuthorizationInfo;import org.apache.shiro.authz.SimpleAuthorizationInfo;import org.apache.shiro.crypto.hash.SimpleHash;import org.apache.shiro.realm.AuthorizingRealm;import org.apache.shiro.subject.PrincipalCollection;import org.apache.shiro.util.ByteSource;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Lazy;import org.springframework.util.StringUtils;import java.util.HashSet;import java.util.Set;public class LoginRealm extends AuthorizingRealm { @Autowired @Lazy private SysUserService sysUserService; private SysRoleService sysRoleService; private SysMenuService sysMenuService; /** * 授权 */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) { String username = (String) arg0.getPrimaryPrincipal(); SysUser sysUser = sysUserService.getUserByName(username); // 角色列表 Setroles = new HashSet (); // 功能列表 Set menus = new HashSet (); SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); roles = sysRoleService.listByUser(sysUser.getId()); menus = sysMenuService.listByUser(sysUser.getId()); // 角色加入AuthorizationInfo认证对象 info.setRoles(roles); // 权限加入AuthorizationInfo认证对象 info.setStringPermissions(menus); return info; } * 登录认证 protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { if (StringUtils.isEmpty(authenticationToken.getPrincipal())) { return null; } //获取用户信息 String username = authenticationToken.getPrincipal().toString(); if (username == null || username.length() == 0) { SysUser user = sysUserService.getUserByName(username); if (user == null) throw new UnknownAccountException(); //未知账号 //判断账号是否被锁定,状态(0:禁用;1:锁定;2:启用) if(user.getStatus() == 0) throw new DisabledAccountException(); //帐号禁用 if (user.getStatus() == 1) throw new LockedAccountException(); //帐号锁定 //盐 String salt = "123456"; //验证 SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo( username, //用户名 user.getPassword(), //密码 ByteSource.Util.bytes(salt), //盐 getName() //realm name ); return authenticationInfo; public static void main(String[] args) { String originalPassword = "123456"; //原始密码 String hashAlgorithmName = "MD5"; //加密方式 int hashIterations = 2; //加密的次数 //加密 SimpleHash simpleHash = new SimpleHash(hashAlgorithmName, originalPassword, salt, hashIterations); String encryptionPassword = simpleHash.toString(); //输出加密密码 System.out.println(encryptionPassword);}
5.登录控制器:
import lombok.extern.slf4j.Slf4j;import org.apache.shiro.SecurityUtils;import org.apache.shiro.authc.*;import org.apache.shiro.subject.Subject;import org.springframework.stereotype.Controller;import org.springframework.ui.ModelMap;import org.springframework.util.StringUtils;import org.springframework.web.bind.annotation.*;@Controller@Slf4jpublic class LoginController { /** * 登录页面 */ @GetMapping(value={"/", "/login"}) public String login(){ return "admin/loginPage"; } * 登录操作 @RequestMapping("/loginSubmit") public String login(String username, String password, ModelMap modelMap) { //参数验证 if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) { modelMap.addAttribute("message", "账号密码必填!"); return "admin/loginPage"; } //账号密码令牌 AuthenticationToken token = new UsernamePasswordToken(username, password); //获得当前用户到登录对象,现在状态为未认证 Subject subject = SecurityUtils.getSubject(); try //将令牌传到shiro提供的login方法验证,需要自定义realm subject.login(token); //没有异常表示验证成功,进入首页 return "admin/homePage"; catch (IncorrectCredentialsException ice) modelMap.addAttribute("message", "用户名或密码不正确!"); catch (UnknownAccountException uae) modelMap.addAttribute("message", "未知账户!"); catch (LockedAccountException lae) modelMap.addAttribute("message", "账户被锁定!"); catch (DisabledAccountException dae) modelMap.addAttribute("message", "账户被禁用!"); catch (ExcessiveAttemptsException eae) modelMap.addAttribute("message", "用户名或密码错误次数太多!"); catch (AuthenticationException ae) modelMap.addAttribute("message", "验证未通过!"); catch (Exception e) //返回登录页 * 登出操作 @RequestMapping("/logout") public String logout() //登出清除缓存 subject.logout(); return "redirect:/login";}
6.前端登录页面:
cxh电商平台管理后台
//提交登录function SubmitLogin() { //判断用户名是否为空 if (!loginForm.username.value) { alert("请输入用户姓名!"); loginForm.username.focus(); return false; } //判断密码是否为空 if (!loginForm.password.value) { alert("请输入登录密码!"); loginForm.password.focus(); return false; } return true;}
上述内容就是springboot如何整合shiro实现登录验证授权的过程解析,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。
登录
密码
验证
用户
配置
认证
用户名
账号
页面
加密
管理
整合
内容
对象
次数
账户
过程
令牌
技能
文件
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
三星网络安全负责人
国家一流网络安全建设学院
天津服务器硬盘回收价钱
软件开发渠道部作用
软件数据库在哪里打开
镇政府网络安全领导小组
网络安全的就业现状及前景
海博网络技术有限公司招聘
庐江网络技术服务优点
美军重视网络安全的原因
数据库技术发展阶段的是
荣世佳软件开发有限公司
网络技术挑战赛历年题目
asp数据库管理系统下载
网络安全等级保护需要费用
与网络安全有关的大学
上海德希网络技术有限责任公司
湖南常见软件开发制造价格
专病数据库建设 ppt
软件开发需要考证不
网络安全与信息委员会职责
excel链接数据库教程
byte 在数据库
沅江电力系统软件开发
端口映射无法创建服务器
农安通用网络技术咨询哪家好
北京手机软件开发品质售后无忧
不属于数据库安全性控制措施
数据库先进物理建模
知富服务器