天天看点

菜鸟学习shiro之用数据库作为Realm的认证源实现登录,角色身份的判定和权限验证3

Maven的的依赖和第一篇是一样的副本直接用

上两篇讲的无论是内部类的封装领域还是配置文件的认证源,这篇开始讲最关心的数据库作为境界的认证源

这里使用的是四郎给我们提供的另一个内置的类JdbcRealm这个是连接数据库的一个内部类,话不多说了,

具体的代码如下:

import com.alibaba.druid.pool.DruidDataSource;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.jdbc.JdbcRealm;
import org.apache.shiro.realm.text.IniRealm;
import org.apache.shiro.subject.Subject;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class JdbcRealmTest {

    DruidDataSource druidDataSource = new DruidDataSource();
    {

        druidDataSource.setUrl("jdbc:mysql://localhost:3306/test");
        druidDataSource.setUsername("root");
        druidDataSource.setPassword("root");
    }

    @Test
    public void testAuthenticationTest() {

        // 设置内置的jdbc
        JdbcRealm jdbcRealm = new JdbcRealm();
        jdbcRealm.setDataSource(druidDataSource);
        // 权限数据的开关
        jdbcRealm.setPermissionsLookupEnabled(true);

        String sql = "select password from test_user where username = ?";
        jdbcRealm.setAuthenticationQuery(sql);

        String roleSql = "select role_name from test_user_role where user_name = ?";
        jdbcRealm.setUserRolesQuery(roleSql);

        // 1.构建SecurityManager环境
        DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
        defaultSecurityManager.setRealm(jdbcRealm);

        // 2.主体提交认证请求
        SecurityUtils.setSecurityManager(defaultSecurityManager);
        Subject subject = SecurityUtils.getSubject();

        // 这个是需要认证的信息
        UsernamePasswordToken token = new UsernamePasswordToken("xiaoming","654321");
        subject.login(token);

        System.out.println("isAuthenticated="+subject.isAuthenticated());

        //subject.logout();
        /*subject.checkRole("admin");

        subject.checkPermission("user:select");*/
        subject.checkRole("user");
    }
}
具体的数据库文件:           

/ *

 Navicat Premium数据传输

 源服务器:根源

 服务器类型:MySQL的的

 源服务器版本:50722

 源主机:本地主机:3306

 源架构:测试

 目标服务器类型:MySQL的的

 目标服务器版本:50722

 文件编码:65001

 日期:28/07/2018 08:18:03

* /

SET NAMES utf8mb4;

SET FOREIGN_KEY_CHECKS = 0;

- ----------------------------

- roles_permissions的表结构

- ------------ --- -------------

DROP TABLE IF EXISTS`coole_permissions`;

CREATE TABLE`colces_permissions`(

  `id` int(11)NOT NULL AUTO_INCREMENT,

  `role_name` varchar(255)CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,

  `permission` varchar(255)CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,

  PRIMARY KEY(`id`)使用BTREE

)ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;

- roles_permissions的记录

- ------------- --- ------------

插入`roles_permissions` VALUES(1,'admin','user:select');

SET FOREIGN_KEY_CHECKS = 1;

-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ------------

 日期:28/07/2018 08:18:17

- test_user的表结构

DROP TABLE IF EXISTS`test_user`;

CREATE TABLE`test_user`(

  `username` varchar(255)CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,

  `password` varchar(255)CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL

)ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT =动态;

- test_user的记录

插入`test_user` VALUES('xiaoming','654321');

-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -----------------

 日期:28/07/2018 08:18:26

- test_user_role的表结构

DROP TABLE IF EXISTS`test_user_role`;

CREATE TABLE`test_user_role`(

  `user_name` varchar(255)CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,

  `role_name` varchar(255)CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL

- ----------------------------

- test_user_role的记录

- ------------- --- ------------

插入`test_user_role` VALUES('xiaoming','user');

SET FOREIGN_KEY_CHECKS = 1;

-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ----------------

/ *

 服务器类型:MySQL的

 源服务器版本:50722

 源主机:本地主机:3306

 目标服务器类型:MySQL的

 目标服务器版本:50722

 日期:28/07/2018 08:18:32

SET NAMES utf8mb4;

- user_roles的表结构

- ------------ ----------------

DROP TABLE IF EXISTS`user_roles`;

CREATE

  TABLE`user_roles` (`id` int(11)NOT NULL AUTO_INCREMENT,

  PRIMARY KEY(`id`)使用BTREE

- user_roles的记录

- ------------- ---------------

INSERT INTO`user_roles` VALUES(1,'Mark','admin');

-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ------------------

 服务器类型:MySQL

 源主机:localhost:3306

 目标服务器类型:MySQL

 日期:28/07/2018 08:18:41

- 用户表结构

- ------------ ---- ------------

DROP TABLE IF EXISTS`users`;

CREATE

  TABLE`user`(`id` int(11)NOT NULL AUTO_INCREMENT,

  `password` varchar(255)CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,

- 用户记录

- ------------- ---- -----------

插入`users` VALUES(1,'Mark','123456');

执行流程和前两篇一样。