Shiro安全框架第五篇| 使用JdbcRealm進行認證授權
阿新 • • 發佈:2018-12-06
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進行認證授權
“掃碼關注“