Shiro安全框架第五篇| 使用JdbcRealm进行认证授权

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数据源

扫描二维码关注公众号,回复: 4391887 查看本文章
 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的整体架构

Shiro安全框架第三篇| Shiro的认证,授权

Shiro安全框架第四篇| Shiro自定义Realm进行认证授权

                   “扫码关注“

 

猜你喜欢

转载自blog.csdn.net/qq_37745470/article/details/84849512
今日推荐