背景
企业应用中,最麻烦的应该就是认证,每个企业都有自己的认证体系,甚至企业内部每个系统有自己的认证方案,其中有基于标准的,有根据标准自定义的,也有完全自定义的,将这么多不同认证体系的系统集成到一个统一认证中心是非常具有挑战性的,所以我一直觉得单点登录的项目是最难做的,也正因为认证体系的多样性,weblogic提供了多种认证方案,看到下面这张图就知道weblogic为什么是最强企业应用中间件了,基本上你能想到的,想不到的认证方式weblogic都提供了解决方案。
这次我们要讨论的就是其中基于SQL的认证SQLAuthenticator
SQLAuthenticator
假如你有张用户表,表里有用户名(username)和密码(password)字段,那么只要select username from user where username=#username and password=#password
有返回结果就说明用户名密码正确登录成功,反之登录失败,SQLAuthenticator
的原理就是这样,你需要提供相应的表和字段并告诉SQLAuthenticator相关查询逻辑那么SQLAuthenticator就可以根据这些配置执行sql获取结果。
配置
- 登录weblogic console,点击
xx_domain->Security Realms
,选择具体的认证域(Realm),默认会创建一个myrealm
,切换到Provider
标签,点击New
新建一个Provider,输入名称,类型选择SQLAuthenticator
,点击OK
- 登录weblogic console,点击
- 在Provider界面点击刚创建的Provider进入配置界面,在common界面,我们需要配置Control Flag这个参数,这个参数非常重要
Control Flag有四种类型,这里你需要知道的是weblogic可以配置多个Provider,并且Provider是有认证顺序的,这个参数主要就是用来控制多个Provider间认证规则
REQUIRED:如果该Provider认证失败那么就失败,weblogic不会继续对后面的Provider进行认证
REQUISITE:该Provider必须认证通过,并且成功以后会继续往下认证,如果接下来的Provider认证成功那么总的认证就是成功,否则就失败。
SUFFICIENT:如果该Provider认证成功就立马返回,如果失败会继续往下认证,直到成功
OPTIONAL:不管该Provider成功与否都会继续往下认证
这里我们将Control Flag设置为SUFFICIENT,也就是如果认证失败就继续往下认证
- 切换到
Provider Specific
界面,这里需要配置具体的sql
- 切换到
Identity Domain: 留空即可
Plaintext Passwords Enabled:开启明文密码,如果密码是明文存储需要开启
Data Source Name:数据源名称,注意不是JNDI名称,必须保证所在的server包含该数据源,如果console需要登录,数据源目标必须包含admin server
Group Membership Searching: 默认即可
Max Group Membership Search Level:默认即可
Password Style Retained:勾选上,这样就能在console中更新密码
Password Algorithm:默认即可
Password Style:选择PLAINTEXT
SQL Get Users Password:默认是SELECT U_PASSWORD FROM USERS WHERE U_NAME = ?,你需要替换为你数据库中的表名和字段名,注意如果多个字段的话字段顺序要按照默认的顺序
剩下的配置都类似,都是配sql,一个完整的认证需要三张表的支持
- 用户表:需包含,密码,用户账号,用户描述(可选)字段
- 角色表:需包含,角色名,角色(可选)字段
- 用户角色表:需包含,角色名,用户账号
这里给个例子
数据库表示例
create table WLS_USER
(
ID VARCHAR2(100),
U_NAME VARCHAR2(100),
U_PASSWORD VARCHAR2(100),
U_DESCRIPTION VARCHAR2(500)
);
create table WLS_GROUP
(
ID VARCHAR2(100),
G_NAME VARCHAR2(100),
G_DESCRIPTION VARCHAR2(500)
);
create table WLS_GROUPMEMBERS
(
G_NAME VARCHAR2(100),
G_MEMBER VARCHAR2(100)
);
相关配置
SQL Get Users Password:SELECT U_PASSWORD FROM WLS_USER WHERE U_NAME = ?
SQL Set User Password: UPDATE WLS_USER SET U_PASSWORD = ? WHERE U_NAME = ?
SQL User Exists: SELECT U_NAME FROM WLS_USER WHERE U_NAME = ?
SQL List Users: SELECT U_NAME FROM WLS_USER WHERE U_NAME LIKE ?
SQL Create User: INSERT INTO WLS_USER(U_NAME,U_PASSWORD,U_DESCRIPTION) VALUES ( ? , ? , ? )
SQL Remove User: DELETE FROM WLS_USER WHERE U_NAME = ?
SQL List Groups: SELECT G_NAME FROM WLS_GROUP WHERE G_NAME LIKE ?
SQL Group Exists: SELECT G_NAME FROM WLS_GROUP WHERE G_NAME = ?
SQL Create Group: INSERT INTO WLS_GROUP(G_NAME,G_DESCRIPTION) VALUES ( ? , ? )
SQL Remove Group: DELETE FROM WLS_GROUP WHERE G_NAME = ?
SQL Is Member: SELECT G_MEMBER FROM WLS_GR,OUPMEMBERS WHERE G_NAME = ? AND G_MEMBER = ?
SQL List Member Groups: SELECT G_NAME FROM WLS_GROUPMEMBERS WHERE G_MEMBER = ?
SQL List Group Members: SELECT G_MEMBER FROM WLS_GROUPMEMBERS WHERE G_NAME = ? AND G_MEMBER LIKE ?
SQL Remove Group Memberships: DELETE FROM WLS_GROUPMEMBERS WHERE G_MEMBER = ? OR G_NAME = ?
SQL Add Member To Group: INSERT INTO WLS_GROUPMEMBERS(G_NAME,G_MEMBER) VALUES( ?, ?)
SQL Remove Member From Group: DELETE FROM WLS_GROUPMEMBERS WHERE G_NAME = ? AND G_MEMBER = ?
SQL Remove Group Member: DELETE FROM WLS_GROUPMEMBERS WHERE G_NAME = ?
SQL Get User Description: SELECT U_DESCRIPTION FROM USERS WHERE U_NAME = ?
SQLSet User Description: UPDATE USERS SET U_DESCRIPTION = ? WHERE U_NAME = ?
SQL Get Group Description: SELECT G_DESCRIPTION FROM GROUPS WHERE G_NAME = ?
SQL Set Group Description: UPDATE GROUPS SET G_DESCRIPTION = ? WHERE G_NAME = ?
需要注意几点:
- 如果只是用到登录操作,只需正确填写select即可
- 如果需要在console中对用户进行管理,那些create语句需要正确填写,默认的insert是不带字段的,需要改成带字段的,和数据库中的表匹配
- 配置完sql,需要调整下provider的顺序,在provider界面点击
Recorder
,将新创建的Provider调整到第一个
- 配置完sql,需要调整下provider的顺序,在provider界面点击
之所以进行调整是因为,默认的Provider DefaultAuthenticator的控制参数是REQUIRED,根本进入不到自定义的Provider中,当然你可以通过更改为SUFFICIENT
- 根据经验,配置完需要重启服务器,虽然界面提示无需重启,你可以用console进行验证,正常用户是能登录但是会提示没有权限,如果提示验证失败,那么就是配的有问题。
注意事项:千万不要把自定义Provider控制参数配置为REQUIRED然后再放到第一个,如果在你的用户中没有管理员用户console就进不去了。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。