采用这个解决方案的前提是,你必须自己先实现一个realm,不过这个我相信大家都会实现的,毕竟默认的不是jdbcRealm ,真正的项目都是要查数据库才能确定用户是否登录的。那么我就假定大家的项目中都有那么一个负责验证登录的 JdbcRealm, 并且是采用用户名密码认证的,在 doGetAuthenticationInfo 方法里面是采用如下的方法来做认证
info = new SimpleAuthenticationInfo(username, passwordtoCharArray(), getName());
这个前提条件保证你的principal是username,相信大部分人根据教程做shiro的时候都采用了这种方式
STEP1 复写 FormAuthenticationFilter 的 isAccessAllowed 方法
做一个新类继承FormAuthenticationFilter ,并复写 isAccessAllowed 方法
package comyqrjxcshiro;
import javaxannotationResource;
import javaxservletServletRequest;
import javaxservletServletResponse;
import orgapacheshirosessionSession;
import orgapacheshirosubjectSubject;
import orgapacheshirowebfilterauthcFormAuthenticationFilter;
import comyqrjxcserviceglobalGlobalUserService;
public class RememberAuthenticationFilter extends FormAuthenticationFilter {
@Resource(name="globalUserService")
private GlobalUserService globalUserService;
/
这个方法决定了是否能让用户登录
/
@Override
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
Subject subject = getSubject(request, response);
//如果 isAuthenticated 为 false 证明不是登录过的,同时 isRememberd 为true 证明是没登陆直接通过记住我功能进来的
if(!subjectisAuthenticated() && subjectisRemembered()){
//获取session看看是不是空的
Session session = subjectgetSession(true);
//随便拿session的一个属性来看session当前是否是空的,我用userId,你们的项目可以自行发挥
if(sessiongetAttribute("userId") == null){
//如果是空的才初始化,否则每次都要初始化,项目得慢死
//这边根据前面的前提假设,拿到的是username
String username = subjectgetPrincipal()toString();
//在这个方法里面做初始化用户上下文的事情,比如通过查询数据库来设置session值,你们自己发挥
globalUserServiceinitUserContext(username, subject);
}
}
//这个方法本来只返回 subjectisAuthenticated() 现在我们加上 subjectisRemembered() 让它同时也兼容remember这种情况
return subjectisAuthenticated() || subjectisRemembered();
}
}
STEP2 设置使用这个新的 AuthenticationFilter (认证过滤器)
如果你用的是spring那么
<!-- 整合了rememberMe功能的filter -->
<bean id="rememberAuthFilter" class="comyqrjxcshiroRememberAuthenticationFilter" ></bean>
<!--将之前的 / = authc 替换成 rememberAuthFilter
/ = rememberAuthFilter
如果你用的是 ini 文件,那么
rememberAuthFilter=comyqrjxcshiroRememberAuthenticationFilter
#将之前的 / = authc 替换成 rememberAuthFilter
/ = rememberAuthFilter
然后重启项目我们来测试一下,先登录一次系统,然后直接关掉浏览器,然后打开浏览器直接输入系统某个页面的地址,发现可以直接进去了,session什么的也设置好了
这个就在在人员表了添加一个身份的字段 user_rank ,用这个来控制。用户登录到时候就会用登录信息,把这个 user_rank 字段带出来,在页面或者链接时候加上判断,哈这是简单的,看下官方的。
shiro安全框架是目前为止作为登录注册最常用的框架,因为它十分的强大简单,提供了认证、授权、加密和会话管理等功能 。
shiro能做什么?
认证:验证用户的身份
授权:对用户执行访问控制:判断用户是否被允许做某事
会话管理:在任何环境下使用 Session API,即使没有 Web 或EJB 容器。
加密:以更简洁易用的方式使用加密功能,保护或隐藏数据防止被偷窥
Realms:聚集一个或多个用户安全数据的数据源
单点登录(SSO)功能。
为没有关联到登录的用户启用 "Remember Me“ 服务
Shiro 的四大核心部分
Authentication(身份验证):简称为“登录”,即证明用户是谁。
Authorization(授权):访问控制的过程,即决定是否有权限去访问受保护的资源。
Session Management(会话管理):管理用户特定的会话,即使在非 Web 或 EJB 应用程序。
Cryptography(加密):通过使用加密算法保持数据安全
shiro的三个核心组件:
Subject :正与系统进行交互的人,或某一个第三方服务。所有 Subject 实例都被绑定到(且这是必须的)一个SecurityManager 上。
SecurityManager:Shiro 架构的心脏,用来协调内部各安全组件,管理内部组件实例,并通过它来提供安全管理的各种服务。当 Shiro 与一个 Subject 进行交互时,实质上是幕后的 SecurityManager 处理所有繁重的 Subject 安全 *** 作。
Realms :本质上是一个特定安全的 DAO。当配置 Shiro 时,必须指定至少一个 Realm 用来进行身份验证和/或授权。Shiro 提供了多种可用的 Realms 来获取安全相关的数据。如关系数据库(JDBC),INI 及属性文件等。可以定义自己 Realm 实现来代表自定义的数据源。
shiro整合SSM框架:
1加入 jar 包:以下jar包自行百度下载
2配置 webxml 文件
在webxml中加入以下代码—shiro过滤器。
<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>orgspringframeworkwebfilterDelegatingFilterProxy</filter-class>
<init-param>
<param-name>targetFilterLifecycle</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/</url-pattern>
</filter-mapping>
3在 Spring 的配置文件中配置 Shiro
Springmvc配置文件中:<bean class="orgspringframeworkaopframeworkautoproxyDefaultAdvisorAutoProxyCreator"
depends-on="lifecycleBeanPostProcessor"/>
<bean class="orgapacheshirospringsecurityinterceptorAuthorizationAttributeSourceAdvisor">
<property name="securityManager" ref="securityManager"/>
</bean>
Spring配置文件中导入shiro配置文件:
<!-- 包含shiro的配置文件 -->
<import resource="classpath:applicationContext-shiroxml"/>
新建applicationContext-shiroxml
<xml version="10" encoding="UTF-8"><beans xmlns=">
导入ehcache-shiroxml配置文件:
<!--
~ Licensed to the Apache Software Foundation (ASF) under one
~ or more contributor license agreements See the NOTICE file
~ distributed with this work for additional information
~ regarding copyright ownership The ASF licenses this file
~ to you under the Apache License, Version 20 (the
~ "License"); you may not use this file except in compliance
~ with the License You may obtain a copy of the License at
~
~ >
准备好了,接下来要写Realm方法了,新建shiro包,在包下新建MyRealmjava文件继承AuthorizingRealm
package shiro;import orgapacheshiroauthcAuthenticationException;import orgapacheshiroauthcAuthenticationInfo;import orgapacheshiroauthcAuthenticationToken;import orgapacheshiroauthcSimpleAuthenticationInfo;import orgapacheshiroauthccredentialHashedCredentialsMatcher;import orgapacheshiroauthzAuthorizationInfo;import orgapacheshiroauthzSimpleAuthorizationInfo;import orgapacheshirocryptohashMd5Hash;import orgapacheshirocryptohashSimpleHash;import orgapacheshirorealmAuthorizingRealm;import orgapacheshirosubjectPrincipalCollection;import orgapacheshiroutilByteSource;import orgspringframeworkbeansfactoryannotationAutowired;import beanuser;import daouserdao;public class MyRealm extends AuthorizingRealm {
@Autowired private userdao userdao;
String pass; /
授权:
/
@Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
Object principal = principalCollectiongetPrimaryPrincipal();//获取登录的用户名
if("admin"equals(principal)){ //两个if根据判断赋予登录用户权限
infoaddRole("admin");
} if("user"equals(principal)){
infoaddRole("list");
}
infoaddRole("user");
return info;
} /
用户验证
/
@Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
//1 token 中获取登录的 username! 注意不需要获取password
Object principal = tokengetPrincipal();
//2 利用 username 查询数据库得到用户的信息
user user=userdaofindbyname((String) principal); if(user!=null){
pass=usergetPass();
}
String credentials = pass; //3设置盐值 ,(加密的调料,让加密出来的东西更具安全性,一般是通过数据库查询出来的。 简单的说,就是把密码根据特定的东西而进行动态加密,如果别人不知道你的盐值,就解不出你的密码)
String source = "abcdefg";
ByteSource credentialsSalt = new Md5Hash(source);
//当前 Realm 的name
String realmName = getName(); //返回值实例化
SimpleAuthenticationInfo info =
new SimpleAuthenticationInfo(principal, credentials,
credentialsSalt, realmName);
return info;
} //init-method 配置
public void setCredentialMatcher(){
HashedCredentialsMatcher credentialsMatcher = new HashedCredentialsMatcher();
credentialsMatchersetHashAlgorithmName("MD5");//MD5算法加密
credentialsMatchersetHashIterations(1024);//1024次循环加密
setCredentialsMatcher(credentialsMatcher);
}
//用来测试的算出密码password盐值加密后的结果,下面方法用于新增用户添加到数据库 *** 作的,我这里就直接用main获得,直接数据库添加了,省时间
public static void main(String[] args) {
String saltSource = "abcdef";
String hashAlgorithmName = "MD5";
String credentials = "passwor";
Object salt = new Md5Hash(saltSource); int hashIterations = 1024;
Object result = new SimpleHash(hashAlgorithmName, credentials, salt, hashIterations);
Systemoutprintln(result);
}
}
好了,接下来我们写一个简单的action来通过shiro登录验证。
//登录认证
@RequestMapping("/shiro-login") public String login(@RequestParam("username") String username,
@RequestParam("password") String password){
Subject subject = SecurityUtilsgetSubject();
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
try { //执行认证 *** 作 subjectlogin(token);
}catch (AuthenticationException ae) {
Systemoutprintln("登陆失败: " + aegetMessage()); return "/index";
}
return "/shiro-success";
}
//温馨提示:记得在注册中密码存入数据库前也记得加密哦,提供一个utils方法//进行shiro加密,返回加密后的结果public static String md5(String pass){
String saltSource = "blog";
String hashAlgorithmName = "MD5";
Object salt = new Md5Hash(saltSource);int hashIterations = 1024;
Object result = new SimpleHash(hashAlgorithmName, pass, salt, hashIterations);
String password = resulttoString();return password;
}
好了,shiro登录验证到这里完了
大家好,一直以来我都本着用最通俗的话理解核心的知识点, 我认为所有的难点都离不开 「基础知识」 的铺垫。目前正在出一个 SpringBoot 长期系列教程,从入门到进阶, 篇幅会较多~
「大佬可以绕过 ~」
如果你是一路看过来的,很高兴你能够耐心看完。之前带大家学了 Springboot 基础部分,对基本的使用有了初步的认识, 接下来的几期内容将会带大家进阶使用,会先讲解基础 中间件 的使用和一些场景的应用,或许这些技术你听说过,没看过也没关系,我会带大家一步一步的入门,耐心看完你一定会有 收获 ~
上期带大家学习了 SpringBoot 中如何去拦截请求, 本期将带大家学习 MyBatis 中如何进行 事务管理 ,同样的,我们集成到 Springboot 中。最近github可能会被墙,所以我把源码放到了国内gitee上,本节我们依然使用上期的代码
我们先了解一下它的基本概念。其实 事务 它不仅是在这里我们提到的 mybatis ,其实它在数据库中也是存在的。 事务 我们从字面意思理解,它好比烤面包,经过一些列的步骤之后,最终提供给客户完整的面包,也就是说中间出现差错,就得回退。可能举这个例子不大合适,再举一个我们业务中的场景吧。用户购买一个商品,首先下单,下完单之后进行支付,支付成功后订单为支付成功状态,跳转成功页,这一系列 *** 作就是一个事务,要么成功要么失败。
在通过上面的例子有了大概了解之后,我们再看看它的基本概念。
下面带大家看看 sql 如何执行事务 *** 作。下面举个例子比较一下
没有事务 *** 作的时候:
以之前的场景给大家举例, 用户支付减少余额 并改订单状态为成功。 当我们的程序执行了上边的两条 sql ,大家觉得有问题吗?这肯定得出事,这不得被人薅死。虽然语句没报错,但是逻辑错了,为啥 因为余额变成负数了,这不是没钱白嫖,还指望用户给你冲上吗。然后订单还给成功了,如果遇到并发大的时候,这得多少钱,发还是不发货呢?告诉用户系统问题?老板看了得哭死。
所以不管是程序上的错误(sql执行错误),还是逻辑上的错误都不能进行下一步 *** 作,所以事务显的尤为重要。那么 sql 怎么提交事务呢
上边只是给大家举个例子,生成中我们还得用 mybatis 去 *** 作。
在 SpringBoot 中执行事务非常简单,首先要开启事务 @EnableTransactionManagement ,在启动类上加上:
添加控制器方法:
我们访问 > / 编码转换,确保写数据库的时候不会出现乱码 / public class CodingConvert { public CodingConvert() { // } public String toGb(String uniStr){ String gbStr = ""; if(uniStr == null){ uniStr = ""; } try{ byte[] tempByte = uniStr 零基础学习java可按照这份大纲来进行学习 第一阶段:Java专业基础课程 阶段目标: 1 熟练掌握Java的开发环境与编程核心知识 2 熟练运用Java面向对象知识进行程序开发 3 对Java的核心对象和组件有深入理解 4 熟练应用JavaAPI相关知识 5 熟练应用JAVA多线程技术 6 能综合运用所学知识完成一个项目 知识点: 1、基本数据类型,运算符,数组,掌握基本数据类型转换,运算符,流程控制。 2、数组,排序算法,Java常用API,类和对象,了解类与对象,熟悉常用API。 3、面向对象特性,集合框架,熟悉面向对象三大特性,熟练使用集合框架。 4、IO流,多线程。 5、网络协议,线程运用。 第二阶段:JavaWEB核心课程 阶段目标: 1 熟练掌握数据库和MySQL核心技术 2 深入理解JDBC与DAO数据库 *** 作 3 熟练运用JSP及Servlet技术完成网站后台开发 4 深入理解缓存,连接池,注解,反射,泛型等知识 5 能够运用所学知识完成自定义框架 知识点: 1、数据库知识,范式,MySQL配置,命令,建库建表,数据的增删改查,约束,视图,存储过程,函数,触发器,事务,游标,建模工具。 2、深入理解数据库管理系统通用知识及MySQL数据库的使用与管理。为Java后台开发打下坚实基础。Web页面元素,布局,CSS样式,盒模型,JavaScript,jQuery。 3、掌握前端开发技术,掌握jQuery。 4、Servlet,EL表达式,会话跟踪技术,过滤器,FreeMarker。 5、掌握Servlet相关技术,利用Servlet,JSP相关应用技术和DAO完成B/S架构下的应用开发。 6、泛型,反射,注解。 7、掌握JAVA高级应用,利用泛型,注解,枚举完成自己的CRUD框架开发为后续框架学习做铺垫。 8、单点登录,支付功能,项目整合,分页封装熟练运用JSP及Servlet核心知识完成项目实战。 第三阶段:JavaEE框架课程 阶段目标: 1 熟练运用Linux *** 作系统常见命令及完成环境部署和Nginx服务器的配置 2 熟练运用JavaEE三大核心框架:Spring,SpringMVC,MyBatis 3 熟练运用Maven,并使用SpringBoot进行快速框架搭建 4 深入理解框架的实现原理,Java底层技术,企业级应用等 5 使用Shiro,Ztree和Spring,SpringMVC,Mybaits完成企业项目 知识点: 1、Linux安装配置,文件目录 *** 作,VI命令,管理,用户与权限,环境部署,Struts2概述,hiberante概述。 2、Linux作为一个主流的服务器 *** 作系统,是每一个开发工程师必须掌握的重点技术,并且能够熟练运用。 3、SSH的整合,MyBatis,SpringMVC,Maven的使用。 4、了解AOP原理,了解中央控制器原理,掌握MyBatis框架,掌握SSM框架的整合。 5、Shiro,Ztree,项目文档,项目规范,需求分析,原型图设计,数据库设计,工程构建,需求评审,配置管理,BUG修复,项目管理等。 6、独立自主完成一个中小型的企业级综合项目的设计和整体架构的原型和建模。独立自主完成一个大型的企业级综合项目,并具备商业价值 第一阶段,JavaSE基础: Java环境搭建、Java流程控制语句-for循环、switch选择判断、循环嵌套、数组拷贝、多维数组、final关键字、构造函数的调用、类的访问权限和路径、面向对象高级特性、Java异常处理、Set,Map,List接口及接口实现类、Java线程、同步阻塞、JavaIO流、文件的 *** 作,复制,读写,删除等。 第二阶段,JavaWeb: MySQL安装、管理、创建数据库、MySQLUPDATE查询、Mysql高级 *** 作、JDBC、JDBC数据库链接 *** 作,JDBC动态Sql处理、Servlet30网页重定向、Servlet30新增的注解支持、AJAX、属性详解等。 第三阶段,Java高级框架-SSH: Struts2异常处理、Struts2Log4j集成、Struts2和JSON实例、Hibernate5、Hibernate集合映射、Hibernate组件映射、Spring40、SpringAOPAspectJ框架、Spring与其它Web框架集成、SpringHibernate支持等。 第四阶段,Java高级框架-SSM: SpringMVC、SpringMVC生成JSON数据、MyBatis、MyBatis环境配置及入门、Mybatisset标签、Mybatistrim标签、Shiro、Shiro快速入门教程、ShiroWeb应用等。 第五阶段,SpringBootVUE全栈框架 SpringBoot、全局异常处理、过滤器监听器、EHCache缓存、SpringBootQuartz定时任务、Vue、Vuejs安装、模板语法、计算属性、事件处理器、Vuejs自定义指令、Vuejs路由等 第六阶段,特色课程 ActiveM环境搭建、生产者和消费者、消息持久化 *** 作、RSA数字加密算法、Codebar条形码生成器、zxing二维码生成器、HighCharts统计图、Echarts统计图、网络播放器ckplayer、嵌入式网络播放器,可以浏览器和移动端随意使用 第七阶段,互联网框架的高级应用1 分布式服务框架的理解,Dubbo架构设计详解及其核心要点,框架运行原理分析、SpringData数据访问、Lucene搜索引擎、Lucene的全文搜索服务器介绍、索引建立方式、Solr海量数据搜索引擎、Socket网络通信、实现RMI远程对象通讯、使用JMS消息服务、Kafka分布式消息系统、WebService与RestfulWS等 第八阶段,互联网框架的高级应用2 SpringSecurity安全框架、实现Web应用安全控制、缓存应用与EhCache框架、OSCache与JBossCache框架、MyBatis与Hibernate缓存机制、NoSQL应用与SQL调优、MongoDBNoSQL数据库、Redis内存数据库、实现RedisSession共享、SQL语句的优化、实现数据库读写分离、WEB应用集群及性能优化、Maven项目管理工具、Web服务器负载均衡、实现Nginx与Tomcat集群、使用LoadRunner测试工具、性能优化之内存调优、代码优化与重构的方法等。
零基础学习java可按照这份大纲来进行学习
第一阶段:Java专业基础课程
阶段目标:
1 熟练掌握Java的开发环境与编程核心知识
2 熟练运用Java面向对象知识进行程序开发
3 对Java的核心对象和组件有深入理解
4 熟练应用JavaAPI相关知识
5 熟练应用JAVA多线程技术
6 能综合运用所学知识完成一个项目
知识点:
1、基本数据类型,运算符,数组,掌握基本数据类型转换,运算符,流程控制。
2、数组,排序算法,Java常用API,类和对象,了解类与对象,熟悉常用API。
3、面向对象特性,集合框架,熟悉面向对象三大特性,熟练使用集合框架。
4、IO流,多线程。
5、网络协议,线程运用。
第二阶段:JavaWEB核心课程
阶段目标:
1 熟练掌握数据库和MySQL核心技术
2 深入理解JDBC与DAO数据库 *** 作
3 熟练运用JSP及Servlet技术完成网站后台开发
4 深入理解缓存,连接池,注解,反射,泛型等知识
5 能够运用所学知识完成自定义框架
知识点:
1、数据库知识,范式,MySQL配置,命令,建库建表,数据的增删改查,约束,视图,存储过程,函数,触发器,事务,游标,建模工具。
2、深入理解数据库管理系统通用知识及MySQL数据库的使用与管理。为Java后台开发打下坚实基础。Web页面元素,布局,CSS样式,盒模型,JavaScript,jQuery。
3、掌握前端开发技术,掌握jQuery。
4、Servlet,EL表达式,会话跟踪技术,过滤器,FreeMarker。
5、掌握Servlet相关技术,利用Servlet,JSP相关应用技术和DAO完成B/S架构下的应用开发。
6、泛型,反射,注解。
7、掌握JAVA高级应用,利用泛型,注解,枚举完成自己的CRUD框架开发为后续框架学习做铺垫。
8、单点登录,支付功能,项目整合,分页封装熟练运用JSP及Servlet核心知识完成项目实战。
第三阶段:JavaEE框架课程
阶段目标:
1 熟练运用Linux *** 作系统常见命令及完成环境部署和Nginx服务器的配置
2 熟练运用JavaEE三大核心框架:Spring,SpringMVC,MyBatis
3 熟练运用Maven,并使用SpringBoot进行快速框架搭建
4 深入理解框架的实现原理,Java底层技术,企业级应用等
5 使用Shiro,Ztree和Spring,SpringMVC,Mybaits完成企业项目
知识点:
1、Linux安装配置,文件目录 *** 作,VI命令,管理,用户与权限,环境部署,Struts2概述,hiberante概述。
2、Linux作为一个主流的服务器 *** 作系统,是每一个开发工程师必须掌握的重点技术,并且能够熟练运用。
3、SSH的整合,MyBatis,SpringMVC,Maven的使用。
4、了解AOP原理,了解中央控制器原理,掌握MyBatis框架,掌握SSM框架的整合。
5、Shiro,Ztree,项目文档,项目规范,需求分析,原型图设计,数据库设计,工程构建,需求评审,配置管理,BUG修复,项目管理等。
6、独立自主完成一个中小型的企业级综合项目的设计和整体架构的原型和建模。独立自主完成一个大型的企业级综合项目,并具备商业价值
hash函数是一种单向散列算法,这意味着从明文可以得到散列值,而散列值不可以还原为明文。
验证密码的方法是将用户输入的密码与盐值按照加密时使用的hash算法再hash一次,并与数据库中存储的hash值作比较,若两者一致则认为密码正确。
以上就是关于Shiro的 rememberMe 功能使用指导为什么rememberMe设置了没作用全部的内容,包括:Shiro的 rememberMe 功能使用指导为什么rememberMe设置了没作用、ssm框架访问控制应该怎么做、SpringBoot进阶之事务管理及并发问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)