7-自定义Realm的DAO操作
dao流程的分析 由于这次自定义myRealm,而shiro自带JdbcRealm帮我们封装好了,负责认证和授权过程sql查询。所以自定义myRealm也要写这些SQL语句。如下
myRealm也要完成认证和授权的SQL
1。 认证(登录时)验证查询
根据username查询用户信息。简单的单表查询
2。授权查询
根据用户名查询该用户的角色信息
根据用户名查询该用户的权限信息
我的SQL认证SQL 单表查询根据username查询用户信息
1select u.id from users u where u.username = 'zhoudu';
授权SQL 根据用户名查询该用户的角色信息,①先查用户角色表中该用户的角色编号。②再根据role_id联合查询用户表、角色表,并且2个表的角色id一样。
1234567891011121314第一步 SELECT ur.rid FROM users_roles ur WHERE ur.uid = ( SELECT u.id FROM users u WHEREu.usern ...
6-自定义Realm的数据表设计
创建表 根据RBAC权限设计,至少需要5张表。
解释
表名
描述
用户表
users
自增id,账号,密码,加盐密码
角色表
roles
自增role_id,角色名称
权限表
permissions
自增permission_id,权限代码,权限名称
用户角色表
users_roles
用户id,角色id,
角色权限表
roles_permissions
角色id,权限id
用户表1234567891011create table users( id int PRIMARY key auto_increment, username varchar(60) not null unique, password varchar(20) not null, password_salt varchar(60))charset=utf8 ENGINE=InnoDB;insert into users(username,password) values('zhoudu','123456');insert into users( ...
5-Shiro标签导入
导入方式 在认证成功进入index页面后,需要看到用户信息,和相关的权限信息。Shiro就提供一套类似jstl的标签使用。shiro标签可以在jsp中也可以在ThemeLeaf中使用。导入后就能使用shiro的标签库。
引入方式
1。 jsp中===> <%@ taglib prefix=”shiro” uri=”hhtp://shiro.apache.org/tags” %>
2。 ThemeLeaf中===>
引入依赖 要引入shiro对ThemeLeaf模板标签的依赖
12345<dependency> <groupId>com.github.theborakompanioni</groupId> <artifactId>thymeleaf-extras-shiro</artifactId> <version>2.0.0 ...
4-Shiro的JdbcRealm介绍和表结构
JdbcRealm简介 JdbcRealm是shiro框架内置的安全数据源,需要连接数据库才能使用。连接的数据库的表结构必须遵循某种规范。
jdbcRealm表结构规范 至少包含三张表,并且表名和字段名都是固定的。如下
123456789101112131415161718192021222324create table users ( id bigint auto_increment, username varchar(100), password varchar(100), password_salt varchar(100), constraint pk_users primary key(id)) charset=utf8 ENGINE=InnoDB;create unique index idx_users_username on users(username);create table user_roles( id bigint auto_increment, username varchar(100), role_name varchar(100), ...
3-SpringBoot整合Shiro
shiro的应用场景 可以在javaSE应用的中的使用;也可以在web应用中的使用;SSM整合(配置多,用的少)。springboot主流
创建SpringBoot项目的过程 使用SpringInitializr快速创建springboot项目,需要集成themeleaf、springboot-web、lombok。使用druid和mybatis当做安全数据传递给realm组件,而且需要连接MySQL。导入以下依赖
1234567891011121314151617181920<dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.22</version> </dependency> <dependency> < ...
2-Shiro安全框架简介
认证授权流程 认证:对用户信息身份检查(登录认证)
授权:对用户权限检查(是否有对应的操作权限)
流程图如下:
安全框架 安全框架相当于保安,对应请求完成认证(有没资格登录)和授权(有没有资格获取对应的权限)的工作。
常用的安全框架有
shiro:
Apache组织的一种开源java安全框架(小而简单)
SpringSecurity
对spring有依赖性
OAuth2:
第三方授权登录框架(比如王者荣耀可以用微信、QQ账号、微博等等账号登录)
Shrio简介 可以完成用户认证、授权、密码和会话管理。可以引用任何应用系统(主要针对单体项目的权限管理)。
Shiro工作原理 Shiro框架主要有四大功能。
Authentication:身份认证 / 登录,验证用户是不是拥有相应的身份;
Authorization:授权,即权限验证,验证某个已认证的用户是否拥有某个权限或某个角色;
Session Management:会话管理,即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中;会话可以是普通 JavaSE 环境的 ...
1-Shiro框架学习之权限设计
权限管理的场景描述 假如为一个服装公司设计一套有服装销售,客户信息采集,人员调动等等功能的智能管理系统。需要很多模块和功能。若此系统主要有库存管理、销售管理、客户管理、行政管理、系统管理等等功能。此表格第一行是权限分类名称和缩写代号。第二行到最后一行是权限名称和编号。
库存管理c
销售管理x
客户管理k
行政管理z
系统管理s
入库 1001
新增订单1005
新增客户1009
卫生1013
员工管理1015
出库 1002
取消订单1006
查询客户1010
开关门1014
权限分配1016
查询 1003
订单查询1007
修改客户1011
修改 1004
修改订单1008
删除客户1012
现在有张三、李四分别是公司的销售人员和仓管人员,他们的职责如下表
姓名
职业
权限
张三
销售
1003、1005~~~~1012
李四
仓管
1001~~~~1004、1005、1009
此时ta们要进入公司的一体化管理系统,由于ta们职位不同,所以看到的菜单也不一样。这个系统登录需要账号密码,怎么通过账号来判断 ...
找到所有数组中消失的数字
题目描述 题目url:https://leetcode-cn.com/problems/find-all-numbers-disappeared-in-an-array/
给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。
示例 1:
输入:nums = [4,3,2,7,8,2,3,1] 输出:[5,6] 。
解释:数组nums的长度是8,正常情况nums中的元素是1~8,而nums中缺少了5,6两个数。
示例 2:
输入:nums = [1,1] 输出:[2]
解释:nums数组只有两个2,正常范围是1~2,缺少2
题目分析 创建一个新数组newArr,其长度和就数组nums一样。从旧数组第一个元素开始取出元素值numVal=nums[i](i从0开始)。再把新数组newArr重点第numVal个的元素值赋值为1。一轮循环后新数组的第j个元素是0,就代表这个j是旧数组中缺少的。
12345678910 ...
最长公共前缀
题目描述编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。
示例 1:输入:strs = [“flower”,”flow”,”flight”]输出:”fl”
示例 2:输入:strs = [“dog”,”racecar”,”car”]输出:””解释:输入不存在公共前缀。
题目分析 我的思路 for循环取出每个字符串
找出这些字符串中长度最小的一个 minLen,取出每个字符串的首字母 比较 。比较minLen次, 难点在于我不知道strs中有多少个字符串str,即使知道了也不能一次性把每个字符串str的首字母取出来比较。比如我有hashMap存储strs字符串数组,key—>是字符串str的下标strIndex,value—>char[]的,方便取出每个str的首字符
1234567HashMap <Integer,char[]> map = new HashMap(); int chhh =0; int strsLen = strs.length; for(int j=0;j<str ...
申请历史表归历史操作
历史表的增加 使用oracle的语法来判断某个历史表是否存在。首先申明一个Integer变量 ,查询这张表是否存在,并把存在的结果复制给一个Integer变量、integer=0就创建表,主表的DDL语句在svn的中有,只不过修改的时候要改变表名,数据库名,索引名,这些名前面都拼接his_。
归历史操作 定义一个number类型的v_rowcount变量,把查询语句的结果复制给v_row
count,v_rowcount=0 表明查询的表没有记录归历史条件,否则存在归历史记录但是要修改数据,curr_datetime < to_date($data_date$,''YYYYMMDD'')





