1. 程式人生 > >Shiro安全框架第五篇| 使用JdbcRealm進行認證授權

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資料來源

 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進行認證授權

 

                   “掃碼關注“