以下节选择《Netkiller Architect 手札》 作者:netkiller 地址 http://www.netkiller.cn/architect/ 接下来几周的话题是数据库安全。...Token 认证 我们在staff表的基础上增加 token 字段 CREATE TABLE `staff` ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT
上篇文章我们介绍了SpringSecurity系统认证的流程,我们发现系统认证其实是通过一个UserDetailService的实现类来实现的,所以我们就可以使用相同的方式将认证的业务改成和数据库的对比...-- 配置数据库连接池 --> <!...修改数据库中对应的密码 ? ? 六、认证状态判断 我们在实际项目中因为用户的不同操作,可能会给出不同的状态,比如正常,冻结等,SpringSecurity也支持,我们来看下,如何实现。...然后我们在认证的时候使用User对象的另一个构造器就可以了 ?
RADIUS 认证 这种认证方法的操作类似于password,不过它使用 RADIUS 作为密码验证方式。RADIUS 只被用于验证 用户名/密码对。...因此,在 RADIUS 能被用于认证之前,用户必须已经存在于数据库中。 当使用 RADIUS 认证时,一个访问请求消息将被发送到配置好的 RADIUS 服务器。...如果从一台服务器接收到否定响应,则认证失败。如果没有接收到响应,则将会尝试列表中的下一台服务器。要指定多台服务器,可将服务器名放在引号内并且用逗号分隔开。...这个参数可以被用作第二个参数标识例如该用户试图以哪个数据库用户进行认证,它可以被用于 RADIUS 服务器上的策略匹配。如果没有指定标识符,默认使用postgresql。
Peer 认证 Peer 认证方法通过从内核获得客户端的操作系统用户名并把它用作被允许的数据库用户名(和可选的用户名映射)来工作。这种方法只在本地连接上支持。...下列被支持的配置选项用于peer: map 允许在系统和数据库用户名之间的映射。详见Section 20.2。...Peer 认证只在提供getpeereid()函数、SO_PEERCRED套接字参数或相似机制的操作系统上可用。这些 OS 当前包括Linux、大部分的BSD包括OS X以及Solaris。
Ident 认证 ident 认证方法通过从一个 ident 服务器获得客户端的操作系统用户名并且用它作为被允许的数据库用户名(和可选的用户名映射)来工作。它只在 TCP/IP 连接上支持。...当为一个本地(非 TCP/IP)连接指定 ident 时,将实际使用 peer 认证(见Section 20.9)。...下列被支持的配置选项用于ident: map 允许系统和数据库用户名之间的映射。详见Section 20.2。...因此这种认证方法只适用于封闭的网络, 这样的网络中的每台客户端机器都处于严密的控制下并且数据库和操作系统管理员操作时可以方便地联系。换句话说,你必须信任运行 ident 服务器的机器。...注意这样的警告: 标识协议的本意不是作为一种认证或访问控制协议。—RFC 1413有些 ident 服务器有一个非标准的选项,它导致返回的用户名是被加密的,使用的是只有原机器管理员知道的一个密钥。
口令认证 有几种基于口令的认证方法。这些方法的过程类似,但是区别在于用户口令如何被存放在服务器上以及客户端提供的口令如何被通过连接发送。...不过,如果连接被SSL加密保护着,那么可以安全地使用password(不过如果依靠SSL,SSL证书认证可能是更好的选择)。 PostgreSQL数据库口令独立于操作系统用户口令。...每个数据库用户的口令被存储在pg_authid系统目录中。...如果没有为一个用户设置口令,那么存储的口令为空并且对该用户的口令认证总会失败。 不同的基于口令的认证方法的可用性取决于用户的口令在服务器上是如何被加密(或者更准确地说是哈希)的。...如上所释,在这种情况下,指定的认证方法md5将自动切换到使用scram-sha-256方法。
LDAP 认证 这种认证方法操作起来类似于password,只不过它使用 LDAP 作为密码验证方法。LDAP 只被用于验证用户名/口令对。...因此,在使用 LDAP 进行认证之前,用户必须已经存在于数据库中。 LDAP 认证可以在两种模式下操作。...ldapbinddn 当做搜索与绑定认证时,用户要绑定到目录开始执行搜索的DN。 ldapbindpasswd 当做搜索与绑定认证时,用户用于绑定到目录开始执行搜索的口令。...如果那个连接成功,将被授予数据库访问。...如果第二个连接成功,将被授予数据库访问。
SSPI 认证 SSPI是一种用于带单点登录的安全认证的Windows技术。...当使用Kerberos认证时,SSPI和GSSAPI的工作方式相同,详见Section 20.6。...不要禁用这个选项,除非你的服务器运行在一个域账号(这包括一个域成员系统上的虚拟服务账号)下并且所有通过 SSPI 认证的所有客户端也在使用域账号,否则认证将会失败。...upn_username 如果这个选项和compat_realm一起被启用,来自 Kerberos UPN 的用户名会被用于认证。如果它被禁用(默认),会使用 SAM 兼容的用户名。...map 允许在系统和数据库用户名之间的映射。详见Section 20.2。
BSD 认证 这种认证方法操作起来类似于password,不过它使用 BSD 认证来验证口令。BSD 认证只被用来验证用户名/口令对。...因此,在 BSD 认证可以被用于认证之前,用户的角色必须已经存在于数据库中。BSD 认证框架当前只在 OpenBSD 上可用。...PostgreSQL中的 BSD 认证使用auth-postgresql登录类型,如果login.conf中定义了postgresql登录分类,就会用它来认证。...要使用 BSD 认证,PostgreSQL 用户账号(也就是运行服务器的操作系统用户)必须首先被加入到auth组中。在 OpenBSD 系统上默认存在auth组。
PAM 认证 这种认证方法操作起来类似password, 只不过它使用 PAM (插入式验证模块)作为认证机制。默认的 PAM 服务名是postgresql。...因此,在使用 PAM 进行认证之前,用户必须已经存在于数据库中。有关 PAM 的更多信息,请阅读 Linux-PAM 页面2 ....如果 PAM 被设置为读取/etc/shadow,认证将会失败,因为 PostgreSQL 服务器是由一个非 root 用户启动 。...然而,当 PAM 被配置为使用 LDAP 或其他认证验证方法时这就不是一个问题。
以下节选择《Netkiller Architect 手札》 地址 http://www.netkiller.cn/architect/ 接下来几周的话题是数据库安全。 5.6....用户/角色认证 本小节我们实现一个功能,当用户插入,修改或者删除数据时,判断该操作是否具备应有的权限。如果权限不符合就拒绝操作同时提示用户。
信任认证 当trust认证被指定时,PostgreSQL假设任何可以连接到服务器的人都被授权使用他们指定的任何数据库用户名(即使是超级用户)访问数据库。...trust认证对于单用户工作站的本地连接是非常合适和方便的。通常它本身不适用于一台多用户机器。...因此,如果你想利用文件系统权限来控制本地安全,那么从pg_hba.conf中移除host … 127.0.0.1 …行,或者把它改为一个非trust认证方法。...如果通过指定trust的pg_hba.conf行让你信任每一个被允许连接到服务器的机器上的用户,trust认证只适合 TCP/IP 连接。
GSSAPI 认证 GSSAPI是用于 RFC 2743 中定义的安全认证的一个工业标准协议。PostgreSQL根据 RFC 1964 支持带Kerberos认证的GSSAPI。...GSSAPI为支持它的系统提供自动认证(单点登录)。 认证本身是安全的,但通过数据库连接发送的数据将不被加密,除非使用SSL。...,确保你有一个匹配被请求数据库用户名的 principal 的票据。...例如,对于数据库用户名fred,principal fred@EXAMPLE.COM将能够连接。...map 允许在系统和数据库用户名之间的映射。详见Section 20.2。
证书认证 这种认证方法使用 SSL 客户端证书执行认证。因此,它只适用于 SSL 连接。当使用这种认证方法时,服务器将要求客户端提供一个有效的、可信的证书。不会有密码提示将被发送到客户端。...证书的cn(通用名)属性将与被请求的数据库用户名进行比较,并且如果匹配将允许登录。用户名映射可以被用来允许cn与数据库用户名不同。...下列被支持的配置选项用于 SSL 证书认证: map 允许在系统和数据库用户名之间的映射。详见Section 20.2。...在一条指定证书认证的pg_hba.conf记录中,认证选项clientcert被假定为1,并且它不能被关掉,因为这种方法中一个客户端证书是必需的。...cert方法对基本clientcert证书验证测试所增加的东西是检查cn属性是否匹配数据库用户名。
认证问题 认证失败以及相关的问题通常由类似下面的错误消息显示: FATAL: no pg_hba.conf entry for host "123.123.123.123", user "andym",...检查你提供的口令,或者如果错误消息提到了 Kerberos 或 ident 认证类型,检查那些软件。...FATAL: user "andym" does not exist 指示的数据库用户没有被找到。...FATAL: database "testdb" does not exist 你试图连接的数据库不存在。请注意如果你没有声明数据库名,默认会用数据库用户名作为数据库名,这可能正确也可能不正确。...服务器日志可能包含比报告给客户端的更多的有关认证失败的信息。如果你为失败的原因而困惑,那么请检查服务器日志。
介绍 之前使用的全是基于内存的认证,这里使用基于数据库的认证。...spring-boot-maven-plugin 配置数据库
一、数据库设计 建数据库,加用户信息表: DROP TABLE IF EXISTS `sys_user`; CREATE TABLE `sys_user` ( `id` int(11) NOT NULL...platform.jdbc.initialSize=10 platform.jdbc.minIdle=10 platform.jdbc.maxActive=50 同样在WEB-INF的developerConfigContext.xml里,加上数据库...druid.stat.slowSqlMillis=200;druid.stat.logSlowSql=true"/>--> 同样在WEB-INF的developerConfigContext.xml里配置一下数据库认证控制器...-- 认证控制器 --> <bean id="queryDatabaseAuthenticationHandler" name="primaryAuthenticationHandler" class...authenticationHandlersResolvers,原来的是默认primaryAuthenticationHandler,这里改成queryDatabaseAuthenticationHandler,自己定义的认证控制器
客户端认证 当一个客户端应用连接一个数据库服务器时,它将指定以哪个PostgreSQL 数据库用户名连接,就像我们以一个特定用户登录一台 Unix 计算机一样。...在本章中,我们用数据库用户表示“拥有LOGIN权限的角色”。 认证是数据库服务器建立客户端身份的过程,并且服务器决定客户端应用(或者运行客户端应用的用户)是否被允许以请求的数据库用户名来连接。...PostgreSQL提供多种不同的客户端认证方式。被用来认证一个特定客户端连接的方法可以基于(客户端)主机地址、数据库和用户来选择。...20.1. pg_hba.conf文件 客户端认证是由一个配置文件(通常名为pg_hba.conf并被存放在数据库集簇目录中)控制(HBA表示基于主机的认证)。...第一条匹配连接类型、客户端地址、连接请求的数据库和用户名的记录将被用于执行认证。这个过程没有“落空”或者“后备”的说法:如果选择了一条记录而且认证失败,那么将不再考虑后面的记录。
上文中已经大致说明了基于内存的Security认证方式,但是绝大多数情况下,我们的项目是基于数据库的,那如何基于数据库进行认证呢?...创建数据库 数据库文件已经上传到Github,地址 创建对应用户实体类 用户类继承自Security的UserDetails public class User implements UserDetails
领取专属 10元无门槛券
手把手带您无忧上云