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里提交的用户名、密码进行比对,即可认证用户。

spring security:基于MongoDB的认证相关推荐

  1. Spring Security 基于数据库的认证

    介绍 之前使用的全是基于内存的认证,这里使用基于数据库的认证. 设计数据表 这里设计数据表 创建项目 这里使用Mybatis作为项目. 添加如下依赖 添加driud连接池依赖 <dependen ...

  2. Spring Security使用数据库登录认证授权

    一.搭建项目环境 1.创建 RBAC五张表 RBAC,即基于角色的权限访问控制(Role-Based Access Control),就是用户通过角色与权限进行关联. 在这种模型中,用户与角色之间,角 ...

  3. Spring Security | 轻松搞定认证授权~

    文章目录 一.Spring Security 简介 二.整合 Spring Security 1.创建项目,导入依赖 2.创建数据库,搭建环境 3.配置数据库 4.创建实体类 5.实现 UserMap ...

  4. Spring Security关于用户身份认证与授权

    Spring Security是用于解决认证与授权的框架. 创建spring项目,添加依赖 <!-- Spring Boot Security:处理认证与授权 --><depende ...

  5. Spring Security 集成 Authing CAS 认证(一)

    01 集成介绍 单点登录 (Single Sign On),英文名称缩写 SSO,意思是在多系统的环境中,登录单方系统,就可以无须再次登录,访问相关受信任的系统.也就是说,只要登录一次单体系统即可. ...

  6. 详解Spring Security的formLogin登录认证模式

    详解Spring Security的formLogin登录认证模式 一.formLogin的应用场景 在本专栏之前的文章中,已经给大家介绍过Spring Security的HttpBasic模式,该模 ...

  7. Spring Security基于数据库认证用户登录

    Spring Security为我们提供了默认的登录页面,通过重写以AuthenticationManagerBuilder为参数的configure方法,我们可基于各种数据存储来认证用户,比如内存. ...

  8. spring security基于数据库的安全认证 配置

    创建数据库 /* Navicat MySQL Data TransferSource Server : mysql3306 Source Server Version : 50542 Source H ...

  9. 实现账号在一端登入_跟我学spring security 基于数据库实现一个基本的登入登出...

    第一章我们基于内存中的用户信息实现了一个基本的登入功能,不过实际的项目中用户信息一般都是存在数据库中的.本章我们来实现一个比较接近真实项目的登入登出,同时引入UserDetailsService的概念 ...

最新文章

  1. pyradiomics的yaml文件参数设置解读、Li‘s have a solution and plan.
  2. TSNE 正规英文api
  3. AD20学习笔记3---PCB封装库的创建方法及现有封装调用
  4. qt制作一个画板_如何直接用Sketch制作动画|Sketch插件|
  5. 以史为鉴 | 为什么要将「知识图谱」追溯到1956年?
  6. ssh源码编译安装mysql_总结源码编译安装mysql
  7. 网站开发综合技术 HTML
  8. Tensorflow 入门手册(代码与原理释义)
  9. 【Antlr】Antlr 将 CSV文件 转成Map数据结构
  10. 2061:【例1.2】梯形面积【入门题】
  11. php登陆页添加记住密码选项,PHP 实现登录记住密码
  12. ubuntu装指定分区_ubuntu安装时候硬盘如何分区
  13. 千帆竞发 —— 分布式锁
  14. 珠峰海拔8848米,现在有足够大的纸,厚度是0.01米,折多少次高度可以超过珠穆朗玛峰。(JavaScript)
  15. jquery+easyui培训文档
  16. 计算机课教学日志,教师教学日志例文
  17. 2015年大二上-数据结构-图-1-(4)-利用遍历思想求解图问题(2)
  18. 软件设计七大设计原则
  19. 时之扉手游如何在电脑上玩 时之扉手游模拟器教程
  20. 谈谈JavaScript和Java

热门文章

  1. Android 图片识别、图像识别
  2. Android 播放raw文件夹下音频文件,本地MP3文件播放,播放云端MP3文件,获取MP3文件播放时长
  3. python中popen的用法_python中的subprocess.Popen()使用
  4. C# 列出进程以及详细信息
  5. php边框圆角,css3圆角和圆角边框使用方法总结
  6. springboot 整合mybatis实现curd
  7. bootstrap panel 布局
  8. spring框架(三)mvc
  9. 部署gogs_可以更快地查阅 Gogs 文档了!
  10. python调用手机蓝牙_米家生态出品,易锁宝蓝牙U型锁,让开锁更灵活