JdbcRealm
这里使用JdbcRealm,那么需要在pom.xml引入mysql驱动以及alibaba数据源。
1 <!--mysql驱动-->
2 <dependency>
3 <groupId>mysql</groupId>
4 <artifactId>mysql-connector-java</artifactId>
5 </dependency>
6 <!--数据源-->
7 <dependency>
8 <groupId>com.alibaba</groupId>
9 <artifactId>druid</artifactId>
10 <version>1.1.6</version>
11 </dependency>
数据库的创建:
user表:
user_roles表:
roles_permissions表:
设置JdbcRealm数据源
1 public void testAuthentication(){
2 //数据源
3 DruidDataSource dataSource= new DruidDataSource();
4 {
5 dataSource.setUrl("jdbc:mysql://localhost:3306/test");
6 dataSource.setUsername("root");
7 dataSource.setPassword("1111");
8 }
9 JdbcRealm jdbcRealm = new JdbcRealm();
10 jdbcRealm.setDataSource(dataSource);
11 jdbcRealm.setPermissionsLookupEnabled(true);
12}
构建SecurityManager环境,将jdbcRealm设置到SecurityManager环境中,验证用户jiuyue的登陆,以及角色和权限。注意:验证权限必须是将jdbcRealm.setPermissionsLookupEnabled(true)设为ture,不然会验证失败。
1 //1.构建SecurityManager环境
2 DefaultSecurityManager defaultSecurityManager= new DefaultSecurityManager();
3 defaultSecurityManager.setRealm(jdbcRealm);
4 SecurityUtils.setSecurityManager(defaultSecurityManager);
5
6 Subject subject = SecurityUtils.getSubject();
7 //2.主体提交授权认证
8 UsernamePasswordToken token = new
9 UsernamePasswordToken("jiuyue","12345");
10 subject.login(token);
11 System.out.println("isAuthenticate:"+subject.isAuthenticated());
12 subject.checkRole("admin");
13 subject.checkPermission("user:select");
运行代码后测试正常,疑问为什么我没有设置sql的查询语句,也没有使用sql语句进行查询数据库,为什么会验证成功呢?
可以切换到JdbcRealm类,可以看到JdbcRealm类中有默认的sql查询语句。因为我们在不自己设置JdbcRealm的查询语句时候,JdbcRealm会自动去使用自己默认的查询语句。
1 /**
2 * The default query used to retrieve account data for the user.
3 */
4 protected static final String DEFAULT_AUTHENTICATION_QUERY = "select password from users where username = ?";
5
6 /**
7 * The default query used to retrieve account data for the user when {@link #saltStyle} is COLUMN.
8 */
9 protected static final String DEFAULT_SALTED_AUTHENTICATION_QUERY = "select password, password_salt from users where username = ?";
10
11 /**
12 * The default query used to retrieve the roles that apply to a user.
13 */
14 protected static final String DEFAULT_USER_ROLES_QUERY = "select role_name from user_roles where username = ?";
15
16 /**
17 * The default query used to retrieve permissions that apply to a particular role.
18 */
19 protected static final String DEFAULT_PERMISSIONS_QUERY = "select permission from roles_permissions where role_name = ?";
JdbcRealm自定义sql语句
在实际的开发中,我们不可能就简单的使用JdbcRealm默认的sql语句,而是自己自定义的sql语句,更多时候我们的数据库以及数据表都是根据业务需要自己创建的。
首先在数据库创建两个表:
test_user表
test_user_roles表
配置好数据源
1 //数据源
2 DruidDataSource dataSource= new DruidDataSource();
3 {
4 dataSource.setUrl("jdbc:mysql://localhost:3306/test");
5 dataSource.setUsername("root");
6 dataSource.setPassword("1111");
7 }
8 JdbcRealm jdbcRealm = new JdbcRealm();
9 jdbcRealm.setDataSource(dataSource);
10 jdbcRealm.setPermissionsLookupEnabled(true);
自定义sql语句:
1 //自定义sql查询
2 String sql= "select password from test_user where user_name=?";
3 jdbcRealm.setAuthenticationQuery(sql);
4 String sql2="select role_name from test_user_roles where user_name=?";
5 jdbcRealm.setUserRolesQuery(sql2);
6
构建SecurityManager环境,进行登陆以及角色验证。
1 //1.构建SecurityManager环境
2 DefaultSecurityManager defaultSecurityManager= new DefaultSecurityManager();
3 defaultSecurityManager.setRealm(jdbcRealm);
4 SecurityUtils.setSecurityManager(defaultSecurityManager);
5
6 Subject subject = SecurityUtils.getSubject();
7 //2.主体提交授权认证
8 //UsernamePasswordToken token = new UsernamePasswordToken("jiuyue","12345");
9 UsernamePasswordToken token = new UsernamePasswordToken("xiaoa","xa");
10 subject.login(token);
11 System.out.println("isAuthenticate:"+subject.isAuthenticated());
12 subject.checkRole("admin");
专题链接:
Shiro安全框架第一篇| 什么是Apache Shiro?
Shiro安全框架第四篇| Shiro自定义Realm进行认证授权
“扫码关注“