-
shrio的整体架构查看全部
-
Shiro 授权
查看全部 -
SUB 主体
Authenticator 认证器(登陆)
Authorizer 授权器(访问权限)
SessionManager Shiro自己的Session不依赖于Web
SessionDAO Session操作增删改查
CacheManager 缓存操作(缓存角色和权限)
Reaims Shiro和数据库直接的一个桥梁
查看全部 -
创建SecurutyManager对象-》主题提交认证 -》SecurityManager认证-》Authenticator认证-》realm验证
查看全部 -
Shiro会话管理
其会话管理主要涉及到了Shiro整体框架的SessionManager与SessionDao模块。
视频中讲的是与Redis相结合,进行对Session的增删改查操作。
当然Shiro管理Session还可以通过别的介质进行管理。
步骤如下:
先加载Redis,在Maven 的pom.xml文件中配置Redis依赖包,坐标如下:
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.7.3</version> </dependency>
配置Spring与Redis结合的配置文件。新建立Spring-redis.xml文件。
由于之前也没接触过Redis,这里只能重复视频中的配置。配置JedisPool的bean,
其中设置属性jedisPoolConfig、host、port信息,其中JedisPoolConfig则需要另外建立bean,然后将此Bean引入到JedisPool中,host则写本机地址,port一般为6379.当然以上的类都是Redis包下的,Redis是依靠Jedis来实现其功能。然后将此文件导入到Spring.xml主文件中,即采用import标签。
注意:需要下载相应redis server,程序启动的时候,要先启动redis server,否则会报错。
新建util包,建立JedisUtil类,此类中主要是对Redis进行增删改查操作。因为Reids是存放键值对的形式。在JedisUtil中,将JedisPool注入到类中,写入单独方法获取Jedis,即通过JedisPool.getResource()来获取Jedis,此方法用于获取Jedis对象,通过Jedis进行直接对Redis存放值进行增删改查操作。
创建Shiro中SessionDao类,实现AbstractSessionDao,实现其中的增删改查、获取当前活跃的Session等方法。由于redis中存放的是key与value都是二进制的数组形式,所以在修改Redis值的时候需要注意将其转成二进制的数据,并且判断是否存在相应id、session等。
其中:generateSessionId(session) 生成Serializable序列化的sessionId
assignSessionId(session,sessionId) 绑定session与相应的Id值
session.getId 返回的是SessionId值,同理也是Serializable的类型
SerializationUtils.serialize (session) 通过序列化将session转成相应的byte[]数组
SerializationUtils.deserialize(byte[]) 通过反序列化将字节转成Object类型,可通过强转获取 Session对象.
PS:注意session 与 sessionId是否为空的情况判断。另外如果加入前缀,可以在搜索的时候加入前缀+“*”代表搜索前缀是aa的所有匹配的key值。
6.同样JedisUtils中也需要通过Jedis 的get put expire del keys方法进行获取 存储 设置等待时间 删除操作、查询匹配key的值集合。
7.新建类SessionManager 继承 DefaultWebSessionManager类,里面可以什么都不做。
8.在spring.xml文件中,写入SessionManager的Bean 并且写入Sessiondao的bean,将SessionDao的Bean 注入到Sessionmanager中。最后将SessionManager的Bean注入到SecurityManager中即可。
9.此处将5-1与5-2整合在一起了,5-2的例子就不单独写了。
此处在测试过程中,发现系统会读取Session多次。
需要在SessionManager中重写,retrieveSession方法。
a.先通过参数SessionKey获取sessionId,然后判断sessionkey是否为websessionkey,如果是则通过强转将其转为WebSessionKey并且获取ServletRequest。
b.核心是将SessionId 与 Session 放到Reqeust中,如果Request有,则直接拿去,没有在去Redis中拿,如此一来则减少了访问Redis的次数,减轻了Reids 的压力。此时判断request是否为空以及sessionId是否为空,如果同时都不为,则通过sessionId 从request的属性中获取Session,在判断Session是否为空,如果不是空,则返回。
c.当不符合以上条件时候,直接调用父类的方法获取Session,继续判断request是否为空,如果不是空,则将session和sessionId放入到request的属性中即可,方便下次再来寻找直接从request中拿出,不用再多次访问Redis了。
查看全部 -
shiro集成Spring的数据库连接
步骤:
先从pom.xml文件中引入三个包:mysql的驱动包、spring-jdbc包、druid的数据源包。
在spring下建立spring-dao.xml文件。建立数据源的bean,即DruidDataSource类,并且将属性url、username、password设置值。其次建立jdbctemplate的bean,将数据源注入到相应的bean中。
创建dao层包,按照分层结构,分dao接口层以及dao.impl的实现类层。写入UserDao以及实现类。
在spring.xml文件中使用impor标签导入spring-dao.xml文件,以及扫描com.imooc下的所有文件,把新加的注解扫描上。
调用jdbcTemplate方式:直接使用注解@Resource调动,同理调用接口也是此种方式注入。
实现类必须加入@Compont否则无法被扫描到。接口可以不加入。
jdbcTemplate.query方法参数1sql语句2数组参数3RowMapper重写方法mapRow通过方法体的参数ResultSet来获取对应字段的查询值即可。
修改Realm获取值的方式,并且在相应的Controller做判断。
查看全部 -
继承 AuthorizatrionFilter 自定义Filter,
isAccessAllowed 用来校验权限 , 其中的Object 就是filter 定义时后面中括号里的字符串 , 如 perms[sys:delete,user:add] 里面的部分,
查看全部 -
JdbcRealm的方式访问数据库,通过与数据库的连接,验证相应的登录用户与授权。
jdbcRealm新建其实例,并初始化。
Maven中引入mysql的驱动以及相应数据源的类。
新建数据源作为成员变量,并且在静态快中初始化url、username、password等。
将数据源设置到到jdbcrealm中,并且将此realm设置到权限管理中。
之后进行登录等验证,jdbcrealm会在源码的地方写入了默认的进行认证与授权的sql语句,以及表名什么的都规定好了。如果想更改,则写入新的sql语句,并且调用jdbcrealm中的设置认证Query、设置权限Query、设置角色查询的方法,进行修改。
当查询权限的时候,会报错,即便库汇总有次权限,仍旧会报错,因为你需要在jdbcrealm中开启persimisson的为true即可。
其他的与之前的认证与授权的步骤一致。
Maven的配置:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.45</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.12</version> </dependency>
查看全部 -
Shiro 是 Apache的开源的安全框架,
主要应用在认证、授权,会话管理、安全加密、缓存管理。
主要应用在权限管理模块的开发。
查看全部 -
Shiro认证流程:
1:创建SecurityManager;
2: 主体提交认证 ;
3:SecurityManager认证;
4:SecurityManager是用Authenticator来认证;
5:authenticator认证是通过Realm获取认证数据做最终的认证
查看全部 -
Shiro认证
查看全部 -
Shiro也是通过Security Manager提供安全服务
Authenticator 认证器 管理登入登出
Authorizer 授权器 赋予主体有哪些权限
Session Manager Shiro自己实现的session管理
Session Dao 对Session进行增删改查
Cache Manager 缓存管理 可以缓存角色数据、权限数据
Realms shiro与数据库的桥梁,
主体提交认证信息到SecurityManager,SecurityManager调用Authenticator去做认证,Authenticator获取认证信息是通过realms访问数据库,让客户提交信息与realms提供的信息做匹配。
同样的 Authorizer也是通过调用realms获取权限的。
cryptography 安全加密
查看全部 -
spring整合shiro
1.创建项目
2.导入依赖(spring、shiro、springmvc、spring-shiro、shiro-web)
3.创建web.xml(配置前端控制器、过滤器、加载初始化springmvc.xml、加载spring.xml、post请求乱码)
4.创建springmvc.xml(配置上下文扫描,配置mvc的处理器适配器、处理器适配器,配置静态文件扫描)
5.创建spring.xml(加到容器中:shiroFilter,创建SecurityMananger对象并设置自定义Realm,定义自定义的Realm,设置加密的算法)
6.创建login.html (表单账号、密码提交到UserController)
7.自定义Realm
8.创建UserController(接受前台数据,进行shiro登录验证,如果成功返回成功,打印错误)
查看全部 -
创建SecurityManager
主体提交认证 -> SecurityManager认证
Realm验证 <- Authenticator认证
查看全部 -
anon:不需要认证
authBasic:httpBasic
authc:需要认证之后才能访问
user:需要当前存在用户才能访问
logout:退出
perms[] :需要具备相关的权限才可以访问
roles[]: 需要具有[]内的相关权限才可以访问
ssl : 要求是安全的协议
port: 要求端口是[]中的
查看全部
举报