spring security:基于MongoDB的认证

spring security对基于数据库的认证支持仅限于JDBC,而很多项目并非使用JDBC,比如Nosql数据库很多使用的是 Mongo Java Driver,这样就无法用默认的<jdbc-user-service>进行支持认证。

如果项目不是使用JDBC,没么解决办法就是:自己定义一个认证服务。

新建一个CustomUserDetailsService

这个类实现了UserDetailsService接口。代码如下:

public class CustomUserDetailsService implements UserDetailsService {@AutowiredMongoDBHelper dbhelper;/* * 根据用户名加载认证用户*/@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {//步骤一:从数据库中查出用户数据MongoDatabase db = dbhelper.getDB("huanle");MongoCollection<Document> users = db.getCollection("user");Document filter = new Document();filter.append("account",username);Document result = users.find(filter).first();if(result==null) throw new UsernameNotFoundException(username+"不存在");//步骤二:装配到UserDetails,相当于生成了一个<user>标签UserDetails userDetails = new User(result.getString("account"),                     result.getString("password"), true, true, true, true,getAuthorities(result.getInteger("access")) );return userDetails;}/** 根据用户级别,获得角色列表。比如用户级别为1,表示该用户是管理员,则返回ROLE_USER,ROLE_ADMIN* @param access 用户级别* @return 用户角色列表*/public Collection<GrantedAuthority> getAuthorities(int access){List<GrantedAuthority> authList = new ArrayList<GrantedAuthority>(2);authList.add(new SimpleGrantedAuthority("ROLE_USER"));if(access==1){authList.add(new SimpleGrantedAuthority("ROLE_ADMIN"));}return authList;}}

修改spring-security.xml文件

            <http><intercept-url pattern="/user/**" access="hasRole('USER')" /><intercept-url pattern="/admin/**" access="hasRole('ADMIN')" /><form-login login-page="/login"login-processing-url="/login"authentication-failure-url="/login?error"default-target-url="/"username-parameter="phone"password-parameter="password" /><logout invalidate-session="true"logout-url="/loginout"logout-success-url="/login"/></http>  <authentication-manager><authentication-provider user-service-ref="customUserDetailsService" ></authentication-provider></authentication-manager><!-- 自定义认证服务 --><beans:bean id="customUserDetailsService" class="com.huanle.utils.security.CustomUserDetailsService"></beans:bean>

这里通过<form-login>标签定义了登录,其相关属性说明如下:

属性说明
login-page=”/login”登录界面的位置
login-processing-url=”/login”登录表单post到“/login”
authentication-failure-url=”/login?error”登录失败,重定向到“/login?error”
default-target-url=”/”登录成功,重定向到“/”
username-parameter=”phone”登录表单中,名为phone的参数作为认证的username
password-parameter=”password”登录表单中,名为password的参数作为认证的password

通过<authentication-provider user-service-ref="customUserDetailsService" >使用我们自定义的认证服务

最后,看一下login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@taglib prefix="my" uri="/WEB-INF/custom.tld" %>    
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用户登录</title>
</head>
<body><form:form  action="/login" method="post" commandName="login"><ul><li>手机号:<form:input id="phone" name="phone" type="text" path="phone" /></li><li>密码:<form:input id="password" name="password" type="text" path="password"/></li><li><input style=" margin-right:30px; margin-left:70px" type="submit" value="登录"/></li></ul></form:form></body>
</html>

可见,这个登录页面跟平常使用的并无区别,这都要归功于username-parameter="phone"password-parameter="password"这两个配置。

总结

从上面的代码可见,自定义的用户认证服务CustomUserDetailsService的唯一任务就是:根据用户名从数据库获取用户数据,生成一个UserDetails实例。

这个UserDetails实例包含了用户名和密码,spring security从这个对象里获得数据库里的用户数据,和从form里提交的用户名、密码进行比对,即可认证用户。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/430125.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pandas 提取某几列_【科学计算工具二】初识Pandas

和Numpy最大的不同&#xff0c;Pandas的数据有对应的index。一、Series数组Series 是带有标签的一维数组&#xff0c;可以保存任何数据类型&#xff08;整数&#xff0c;字符串&#xff0c;浮点数&#xff0c;Python对象等&#xff09;&#xff0c;轴标签统称为索引创建Series数…

maven+springmvc下载excle文件——ie8可用

mavenspringmvc下载excle文件——ie8可用转载于:https://www.cnblogs.com/zhujiabin/p/5866535.html

spring security:自定义认证成功处理器

使用spring认证登录&#xff0c;登录之后&#xff0c;一般还需要进行其他处理&#xff0c;例如&#xff1a;保存登录时间、登录ip到数据库&#xff0c;缓存用户信息到redis数据库等等&#xff0c;这些操作可以通过自定义一个登录成功处理器来处理。 自定义认证成功处理器 只需…

开发物体识别桌、_科研人员开发突破性的技术,允许盲人识别形状和物体

一项令人难以置信的新技术正在让失明人士有能力识别形状和物体&#xff0c;而这些形状和物体都是在他们的大脑上“画出来”的。一篇描述该技术的研究论文刚刚发表在《细胞》杂志上&#xff0c;正如ScienceNews报道的那样&#xff0c;这可能是向盲人提供一种视觉上与周围世界互动…

【第一周】PSP

日期C类别C内容S开始时间E结束时间I间隔(单位:分钟)T净时间(单位:分钟)9月2日编程词频统计7:359:35101109月3日读书构建之法8:009:00555 编程词频统计13:0014:000609月4日读书构建之法8:009:00060 编程四则运算13:0015:0010110总时间&#xff1a;395分钟&#xff0c;约等于6.58…

spring webflow getting start

概述 很多时候&#xff0c;我们写的流程都嵌在一大堆代码中&#xff0c;没有办法直观的管理。而spring webflow可以将流程抽出来&#xff0c;放到一个单独的xml文件中&#xff0c;这样流程就不会埋没在代码里了。 今天要做一个很简单的流程&#xff1a; 商品发布流程 Created…

pythonvim编辑教程_Pycharm学习教程(6) Pycharm作为Vim编辑器使用

Pycharm作为Vim编辑器使用&#xff0c;具体内容如下1、主题如果你是Vim的粉丝&#xff0c;并且不打算使用其他类型的编辑器&#xff0c;那么这篇教程将会比较适合你。这里将会详细介绍如何在Pycharm IdeaVim插件的帮助下下载、安装、使用Vim。至于有关Python编程以及Vim的用法&…

什么是cname a记录

https://support.dnsimple.com/articles/cname-record/ CNAME就是别名记录&#xff0c;就是负责跳转&#xff0c;比如你给某个地址设置了一个cname,那当访问那个cname的时候&#xff0c;就会跳转到那个某个地址 a记录就是一个ip地址所对应的地址。可以理解为a记录就是一个连接器…

Spring上传时报Invalid CSRF Token错误解决方案

概述 使用spring security之后&#xff0c;默认上传文件会报这个错&#xff0c;解决方案有下面两个&#xff1a; 解决方案一&#xff1a; 将 MultipartFilter 放在 springSecurityFilterChain 前面 修改web.xml文件&#xff1a; <!-- 文件上传过滤器&#xff0c;过滤上传…

windows 修改nginx端口号_分享Nginx搭建图片服务器简单实现

第一步&#xff1a;安装vsftpd提供ftp服务https://www.cnblogs.com/lyq159/p/12070791.html第二步&#xff1a;安装Nginx提供http服务1.安装准备&#xff1a;安装Nginx环境a) gcc      安装nginx需要先将官网下载的源码进行编译&#xff0c;编译依赖gcc环境&#xff0c;如…

C#学习笔记-数据的传递(公共变量)以及Dictionary

看的代码越多&#xff0c;写的代码越多&#xff0c;就越是享受这些字符&#xff0c;终于渐渐懂得了那种传闻中的成就感&#xff0c;特别是自己从看不懂然后一步一步学&#xff0c;一个代码一个代码地敲&#xff0c;最后哪怕只是完成了一个小功能&#xff0c;也都是特别自豪的&a…

spring webflow : 上传单个文件实例

准备 如果你项目中使用了spring security的话&#xff0c;参考上一篇文章&#xff0c;使用上篇的第二种方法&#xff0c;并去掉MultipartFilter&#xff08;如果有配置的话&#xff09;&#xff0c;否则得不到文件流程中的变量&#xff08;如用var标签定义的变量&#xff09;&…

pythonopencv图像形态_Python+OpenCV图像处理之其他形态学操作

顶帽(Top Hat)&#xff1a;原图像与开操作之间的差值图像&#xff0c;突出原图像中比周围亮的区域黑帽(Black Hat)&#xff1a;闭操作图像与原图像的差值图像, 突出原图像中比周围暗的区域形态学梯度(Gradient)&#xff1a;基础梯度&#xff1a;基础梯度是用膨胀后的图像减去腐…

Spring webflow:上传多个文件

上篇讲了上传单个文件&#xff0c;在上篇的基础上稍作修改就可以上传多个文件了。 实现 首先&#xff0c;实体类要修改&#xff0c;使用List来存储多个文件&#xff1a; Component public class GoodsEntity implements Serializable{private static final long serialVersi…

csv格式清洗与转换python_实例详解Python中 CSV格式清洗与转换

Python中 CSV格式清洗与转换的实例代码题目&#xff1a;CSV格式清洗与转换描述附件是一个CSV格式文件&#xff0c;提取数据进行如下格式转换&#xff1a;‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪…

斐波那契数列通项公式

1.对于斐波那契数列来说&#xff0c;存在通项公式&#xff0c;f[n] 2、Hdu练习题1568&#xff1b; 大意求斐波那契数列中的某一项&#xff0c;n很大&#xff0c;只能在O(1)时间求出&#xff0c;并且只要前四位 当n很大时最后一项几乎为零转载于:https://www.cnblogs.com/dlut-l…

Spring MVC 生成文件类型响应

图片控制器代码如下&#xff1a; Controller RequestMapping("/") public class WebController {RequestMapping(methodRequestMethod.GET,path"/img/{imgNo}")public void getImg(HttpServletResponse response,int index) throws IOException{ //读取图…

服务器驱动精灵_驱动精灵真的可以帮你安装驱动吗?别再无脑装驱动了

之前和大家讲过一期安装官方纯净系统的方法&#xff0c;戳我查看然后很多人就说重装之后显卡驱动掉了打游戏卡的跟PPT一样。于是很多人在重装系统或是进行了重大硬件更新后&#xff0c;一般会采用第三方驱动管理软件来进行硬件的更新&#xff0c;实际上这是一种自杀式行为&…

(原创)网吧桌面背景添加文字,转载注明出处!

很简单的小工具&#xff0c;可用于公告等。 下载地址&#xff1a;http://pan.baidu.com/s/1i5dPQTJ 密码&#xff1a;sfw7 博客地址&#xff1a;http://www.cnblogs.com/flybox/ 如有必要&#xff0c;后续可添加功能&#xff1a;远端配置文字内容等&#xff0c;方便多网吧统一…

MongoDB 操作范例

查询 查询嵌套文档 比如&#xff0c;有商品文档goods&#xff0c;结构如下&#xff1a; {"name":"牙刷","class":{"classNo": 111,"name":"日用品"} } 现在要查找所有 classNo111的商品&#xff0c;怎么查&am…