用户:匿名权限(游客,不需要登入就具备的权限)

用户认证:是一个真正的用户

权限认证:是否具有一些特权,菜单权限,按钮权限,url访问权限

从最简单的用户登入、登出开始(11start)-->权限精细化控制(11core)-->sso单点登入实现方式(11top grade)

pom.xml

<!-- ===========================强化依赖================================ --><!-- Shiro 权限控制  --><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.4.0</version></dependency><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-web</artifactId><version>1.3.2</version></dependency><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version>1.4.0</version></dependency><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-ehcache</artifactId><version>1.4.0</version></dependency><dependency><groupId>com.github.theborakompanioni</groupId><artifactId>thymeleaf-extras-shiro</artifactId><version>2.0.0</version></dependency><!-- ===========================================其它依赖=============================================== --><!-- 简化实体类代码编写 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>
public static void main(String[] args) {//生成密码盐//String randomSalt = new SecureRandomNumberGenerator().nextBytes().toBase64();String randomSalt = new SecureRandomNumberGenerator().nextBytes().toHex();//将原始密码加盐,用MD5算法加密3次String password = new Md5Hash("123456",randomSalt,1).toString();System.out.println("密码盐料:"+randomSalt);System.out.println("密码加密:"+password);}

happyCode.sql

/*
Target Server Type    : MYSQL
Source Host           : 192.127.0.1:3306
Source Database       : happyCode
*/# 测试表
DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id',`content` varchar(255) DEFAULT NULL COMMENT '内容',`version` int(11) DEFAULT NULL COMMENT '版本',PRIMARY KEY (`id`)
)ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
INSERT INTO `test`(content) value("测试");# 用户表
DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user`(`uid` int(11) NOT NULL AUTO_INCREMENT,`password` varchar(255) DEFAULT NULL,`salt` varchar(255) DEFAULT NULL,`state` tinyint(4) NOT NULL,`username` varchar(255) DEFAULT NULL,`fullname` varchar(255) DEFAULT NULL,PRIMARY KEY (`uid`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
INSERT INTO `sys_user` (`uid`,`username`,`fullname`,`password`,`salt`,`state`) VALUES ('1', 'root', '超级管理员', '02f7f19c004b7f3369f29b34f868fb4a', '6a6ad5eadcd06d22cab18e31b4d0cdab', 0);

SysUser:mapper、service、controller

public interface SysUserMapper {@Select("select uid,username,password,fullname,state,salt from sys_user where username = #{username}")public SysUser selectSysUserByUsername(String username);
}

用户ID,用户名称(一般唯一,用户名已被注册,不唯一也可用实现行),用户昵称,密码密文,密文密码盐,用户状态(可用、冻结。。。)...

ShiroConfig.java SpringBoot2.0集成Shiro配置(约定大于配置,真心感觉以前的Spring、SpringMVC的xml配置太多太过复杂了)

package com.oo.config.shiro;import java.util.LinkedHashMap;
import java.util.Map;import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.mgt.SecurityManager;import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/***  用户权限配置类* @author LU http://blog.csdn.net/phone13144830339* @date 2018年11月10日*/
@Configuration
public class ShiroConfig {/***    配置过滤器* @param securityManager* @return*/@Bean("shiroFilter")                                                                                                                                                                                                               public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {//定义shiroFactoryBeanShiroFilterFactoryBean shiroFilterFactoryBean=new ShiroFilterFactoryBean();//设置securityManager 安全管理器shiroFilterFactoryBean.setSecurityManager(securityManager);//进行顺序拦截器配置 LinkedHashMap是有序的Map<String,String> filterChainMap = new LinkedHashMap<String,String>();//资源文件访问配置,anon匿名访问、authc用户认证filterChainMap.put("/css/**","anon");filterChainMap.put("/js/**","anon");filterChainMap.put("/img/**","anon");filterChainMap.put("/login", "anon");filterChainMap.put("/logout","logout");filterChainMap.put("/**","authc");//其它的,要authc:用户认证shiroFilterFactoryBean.setLoginUrl("/login.html");//设置用户进行认证跳转的页面shiroFilterFactoryBean.setSuccessUrl("/index.html");//设置用户认证成功跳转的页面shiroFilterFactoryBean.setUnauthorizedUrl("/403.html");//设置用户没有权限跳转的页面//设置shiroFilterFactoryBean的FilterChainDefinitionMapshiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainMap);return shiroFilterFactoryBean;}@Beanpublic SecurityManager securityManager(){DefaultWebSecurityManager securityManager =  new DefaultWebSecurityManager();//设置自定义realmsecurityManager.setRealm(myShiroRealm());return securityManager;}/*** 身份认证realm;* (这个需要自己写,账号密码校验;权限等)* @return*/@Beanpublic MyShiroRealm myShiroRealm(){MyShiroRealm myShiroRealm = new MyShiroRealm();myShiroRealm.setCredentialsMatcher(hashedCredentialsMatcher());return myShiroRealm;}/*** 凭证匹配器* (由于我们的密码校验交给Shiro的SimpleAuthenticationInfo进行处理了*  所以我们需要修改下doGetAuthenticationInfo中的代码;* )* @return*/@Beanpublic HashedCredentialsMatcher hashedCredentialsMatcher(){HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();hashedCredentialsMatcher.setHashAlgorithmName("md5");//散列算法:这里使用MD5算法;hashedCredentialsMatcher.setHashIterations(1);//散列的次数,比如散列两次,相当于 md5(md5(""));return hashedCredentialsMatcher;}
}

自定义Relam,进行用户认证,用户授权

package com.oo.config.shiro;import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
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 com.oo.core.entity.SysUser;
import com.oo.core.service.impl.SysUserService;/***  自定义realm实现认证*/
public class MyShiroRealm extends AuthorizingRealm {@AutowiredSysUserService sysUserService;/*** 认证信息.(身份验证)* @param token* @return* @throws AuthenticationException*/@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {//获取用户的输入的账号Subject login登入时, Token中传递的用户名称参数,UsernamePasswordToken token = new UsernamePasswordToken(user.getUsername(), user.getPassword());//用户名称,用户密吗String username = (String)token.getPrincipal();SysUser user =  sysUserService.selectSysUserByUsername(username);if(!user.getUsername().equals(username)) {return null;}SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(user, user.getPassword(),ByteSource.Util.bytes(user.getSalt()), getName());return authenticationInfo;}/*** 用户 授权*/@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();return authorizationInfo;}
}

LoginController

package com.oo.core.controller;import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.LockedAccountException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;import com.oo.core.entity.SysUser;
@Controller
public class LoginController {Logger logger = LoggerFactory.getLogger(LoginController.class);@PostMapping("/login")String login(SysUser user) {UsernamePasswordToken token = new UsernamePasswordToken(user.getUsername(), user.getPassword());//用户名称,用户密吗String error = null;Subject currentUser = SecurityUtils.getSubject();try {token.setRememberMe(true);//将用户信息记住到Cookie中currentUser.login(token);} catch (UnknownAccountException e) {error = "账号错误";e.printStackTrace();} catch (IncorrectCredentialsException e) {error = "密码错误";e.printStackTrace();} catch (LockedAccountException e) { error = "账号锁定";e.printStackTrace();} catch (AuthenticationException e) {error = "其他问题";e.printStackTrace();}if(error==null) {return "redirect:index.html";} else {logger.info("登入失败!"+"["+error+"]");return "redirect:login.html";}}}

happyCode(11start) 权限控制 shiro 密码MD5安全加密,密码盐,系统用户认证相关推荐

  1. MD5码加密(盐值加密)

    MD5码加密(盐值加密) ​ 主要应用于用户密码在数据库的存储,当我们需要保存用户账号密码信息用于身份验证时,如果密码直接以明码的形式保存在数据库,很容易在数据库信息泄露时造成安全隐患. ​ 所以需要 ...

  2. 【JS 逆向百例】某易支付密码 MD5+AES 加密分析

    关注微信公众号:K哥爬虫,持续分享爬虫进阶.JS/安卓逆向等技术干货! 声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后 ...

  3. 权限控制-Shiro

    一:问题的引入 前面虽然基本的功能都有了但是页面按钮的控制与url的控制还是没有处理.这么一个场景,虽然用户只能通过点击菜单进行各个界面的访问,假如用户知道了你的界面的访问url,直接跳过菜单访问的话 ...

  4. linux密码是什么加密方式,Linux系统的几种加密

    启动流程: BIOS --> MBR(主引导记录,找到系统在哪个分区) --> boot loader(grub) -->kernel(内核)-->进入启动级别init 硬盘的 ...

  5. Spring Security用户认证和权限控制(默认实现)

    1 背景 实际应用系统中,为了安全起见,一般都必备用户认证(登录)和权限控制的功能,以识别用户是否合法,以及根据权限来控制用户是否能够执行某项操作. Spring Security是一个安全相关的框架 ...

  6. 青锋开源架构-springboot2.6.x+vue3-antdesign-vite之springsecurity实现访问权限控制

    框架开源地址: 青锋开源架构-springboot2.6.x+vue3-antdesign-vite: 青锋-springboot2.6.x+vue3-antdesign-vite开源架构,实现了系统 ...

  7. 简要分析用MD5加密算法加密信息(如有疑问,敬请留言)

    一.引言 最近看了媒体的一篇关于"网络上公开叫卖个人隐私信息"报导,不法分子通过非法手段获得的个人隐私信息,其详细.准确程度简直令人瞠口结舌.在互联网飞速发展的现在,我们不难想到, ...

  8. 全程配图超清晰的Springboot权限控制后台管理项目实战第二期(Springboot+shiro+mybatis+redis)

    全程配图超清晰的Springboot权限控制后台管理项目实战第二期(Springboot+shiro+mybatis+redis) 众所周知,作为一个后端新手学习者,通过项目来学习,增长项目经验,是一 ...

  9. 项目一:第十二天 1、常见权限控制方式 2、基于shiro提供url拦截方式验证权限 3、在realm中授权 5、总结验证权限方式(四种) 6、用户注销7、基于treegrid实现菜单展示...

    1 课程计划 1. 常见权限控制方式 2. 基于shiro提供url拦截方式验证权限 3. 在realm中授权 4. 基于shiro提供注解方式验证权限 5. 总结验证权限方式(四种) 6. 用户注销 ...

最新文章

  1. 2020ICPC·小米 网络选拔赛第一场 全部题解
  2. Complexer-YOLO:基于语义点云的实时三维目标检测与跟踪
  3. 【安全漏洞】ProxyShell利用分析2——CVE-2021-34523
  4. Swift3 Scanner用法之判断是否数字、提取字符串里的数字
  5. html 分页_JQuery堪称完美的分页函数
  6. 更好地在云上:物联网,大数据和人工智能
  7. NumPy 数组学习手册·翻译完成
  8. mysql 字段操作
  9. PHP学习总结(13)——PHP入门篇之常量
  10. 2020 年百度之星·程序设计大赛 - 初赛一 Civilization BFS广搜
  11. 关于在CLASSWIZARD中找不到工作区间中的类的解决方法
  12. 如果有一天不做程序员了,还能入什么行业?
  13. vs2008的简单使用
  14. 图像处理边缘处理:Roberts算子和canny算子,对圆与矩阵进行识别
  15. EVE模拟器的使用-带图超详细(学网络用)
  16. unity3D神奇bug,显示中文异常
  17. html5 制作书架展示 PHP,基于HTML5 Canvas的CSG构造实体几何书架
  18. English—句子
  19. Python爬虫系列(七)豆瓣图书排行榜(数据存入到数据库)
  20. Nanopore牛津纳米孔测16S学习笔记

热门文章

  1. html3d旋转效果相册,HTML5css3:3D旋转木马效果相册
  2. [BJDCTF2020]ZJCTF,不过如此
  3. Excel表格密码保护的解除方法
  4. 卸载nginx 并重新安装
  5. ESP32学习笔记(47)——加密算法AES/MD5/SHA
  6. 【ubuntu编译安装Halide】
  7. matplotlib - 自定义散点形状marker的3种方法
  8. C语言实现简单小游戏---扫雷
  9. 0x80073712_解决Windows 组件存储已损坏,0x80073712错误
  10. 0x80073712_win10系统更新提示错误代码“0x80073712”的解决方法