Shiro认证与授权、JdbcRealm的使用方法

1.什么是Shiro?

Shiro是Apache的一个开源的安全框架。

2.Shiro可以做什么

提供安全认证(普通用户或管理员)、授权(该用户是否可以进行相关操作)、企业会话管理(Session)、安全加密(如MD5)

我使用的开发工具是idea,创建一个maven项目。

导入相关dependency


        
            org.apache.shiro
            shiro-core
            1.2.5
        

        
        
            junit
            junit
            4.12
        


        
        
            mysql
            mysql-connector-java
            5.1.39
        

        
        
            com.alibaba
            druid
            1.1.12
        

一、认证与授权操作:Shiro认证与授权、JdbcRealm的使用方法_第1张图片

Shiro认证与授权、JdbcRealm的使用方法_第2张图片

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.SimpleAccountRealm;
import org.apache.shiro.subject.Subject;
import org.junit.Before;
import org.junit.Test;

public class testAuthentication {

    //创建一个用户Realm实例
    SimpleAccountRealm simpleAccountRealm=new SimpleAccountRealm();

    @Before
    public void addUser(){
        //添加一条信息 用户用于校验的信息集合 一般存在于数据库
        //依次为用户名,密码,用户角色
        simpleAccountRealm.addAccount("admin","123456","user");
    }

    @Test
    public void authenticationtest(){
        /*构建SercurityManager环境*/
        DefaultSecurityManager defaultSecurityManager=new DefaultSecurityManager();
        defaultSecurityManager.setRealm(simpleAccountRealm);
        /*主体提交认证*/
        SecurityUtils.setSecurityManager(defaultSecurityManager);
        Subject subject= SecurityUtils.getSubject();

        //用户用于检验的对象类实体
        UsernamePasswordToken token=new UsernamePasswordToken("admin","123456");
        subject.login(token);
        
        //验证是否校验成功返回true或false
        System.out.println(subject.isAuthenticated());

        //验证是否为该种角色 若不为该角色抛出异常
        subject.checkRoles("user");
    }
}

测试结果:输出true

0.创建SimpleAccountRealm对象并向其中插入校验信息。

1.构造SecurityManager环境并设置Realm实例(Realm是用户实体)

2.创建主体Subject,将SecurityManager环境配置到SecurityUtils中,使主体可以与Realm交互

3.创建一个用户认证的对象UserNamePasswordToken(用户输入的用户名和密码)

4.Subject执行login操作

5.输出subject.isAuthenticated()结果

6.检查角色的真实性

操作目的:

1.认证:证明用户输入的用户名和密码与数据库中的用户名密码匹配与否。

2.授权:证明该用户是某种角色

二、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.subject.Subject;
import org.junit.Test;

public class JdbcRealmTest {

    //创建一个数据源
    DruidDataSource druidDataSource=new DruidDataSource();

    {
        //配置数据源信息
        druidDataSource.setUrl("jdbc:mysql://localhost:3306/shiro_test");
        druidDataSource.setUsername("root");
        druidDataSource.setPassword("123456");
    }

    @Test
        public void authenticationtest(){
        //创建一个JdbcRealm
        JdbcRealm jdbcRealm=new JdbcRealm();
        /*设置数据源*/
        jdbcRealm.setDataSource(druidDataSource);
        //设置为true时允许查询权限数据
        jdbcRealm.setPermissionsLookupEnabled(true);

        //设置认证查询
        String sql="select password from users where username = ?";
        jdbcRealm.setAuthenticationQuery(sql);
        
        /*设置角色查询*/
        String role_sql="select role_name from user_roles where username=?";
        jdbcRealm.setUserRolesQuery(role_sql);
        
        /*设置权限查询*/
        String premission_sql="select permission from roles_premission where role_name = ?";
        jdbcRealm.setPermissionsQuery(premission_sql);

        /*构建SercurityManager环境*/
        DefaultSecurityManager defaultSecurityManager=new DefaultSecurityManager();
        defaultSecurityManager.setRealm(jdbcRealm);
        /*主体提交认证*/
        SecurityUtils.setSecurityManager(defaultSecurityManager);
        Subject subject= SecurityUtils.getSubject();
        
        /*创建一个待验证的实体*/
        UsernamePasswordToken token=new UsernamePasswordToken("xiaoming","123456");
        subject.login(token);
        
        /*检查用户认证是否通过*/
        System.out.println(subject.isAuthenticated());
        /*检验是否为该角色*/
        subject.checkRole("admin");
        /*检验是否拥有该权限*/
        subject.checkPermission("user:select");
    }
}

前期准备:

1.建立三张表,分别是用户表user(id,username,password),角色表user_roles(id,username,role_name),权限表role_permission(id,role_name,permission)。

操作过程:

0.配置数据源DruidDataSource

1.创建JdbcRealm对象并设置数据源

2.设置认证和授权sql语句

3.构造SecurityManager环境并设置Realm实例(JdbcRealm)

4.创建主体Subject,将SecurityManager环境配置到SecurityUtils中,使主体可以与Realm交互

5.创建一个用户认证的对象UserNamePasswordToken(用户输入的用户名和密码)

6.Subject执行login操作

7.输出subject.isAuthenticated()结果

8.检查角色的真实性

你可能感兴趣的:(Shiro认证与授权、JdbcRealm的使用方法)