Shiro内置Realm

 

 

 

IniRealm教程:

 

 

user.ini

[users]
exp=123456,admin
[roles]
admin=user:delete,user:update

 

IniRealmTest.java

复制代码
package com.exp.test;

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.realm.text.IniRealm;
import org.apache.shiro.subject.Subject;
import org.junit.Before;
import org.junit.Test;

public class IniRealmTest {

    IniRealm iniRealm = new IniRealm("classpath:user.ini");

    @Test
    public void Authenication(){

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

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

        UsernamePasswordToken token = new UsernamePasswordToken("exp","123456");

        //用户登录认证
        subject.login(token);

        System.out.println("expworld=>"+ subject.isAuthenticated()); //expworld=>true

        subject.checkRole("admin");
        subject.checkPermission("user:update");

        //用户退出
        subject.logout();
        System.out.println("expworld=>"+ subject.isAuthenticated()); //expworld=>false
    }
}
复制代码

 

JdbcRealm教程:

 总结:JdbcRealm默认会给三个表users、user_roles、roles_permissions和对应的认证授权sql语句。另外,咱们可以自定义表和sql。

JdbcRealmTest.java

复制代码
package com.exp.test;

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;

public class JdbcRealmTest {

    DruidDataSource dataSource = new DruidDataSource();

    {
        dataSource.setUrl("jdbc:mysql://localhost:3310/test_shiro");;
        dataSource.setUsername("root");
        dataSource.setPassword("123456");
    }

    @Test
    public void Authenication(){

        JdbcRealm jdbcRealm = new JdbcRealm();
        jdbcRealm.setDataSource(dataSource);
        jdbcRealm.setPermissionsLookupEnabled(true);//jdbcRealm默认关闭查询权限数据,需要开启


        //自定义表和sql语句查询
        String sql = "select password from test_user where username = ?";
        jdbcRealm.setAuthenticationQuery(sql);//使用自己的查询语句

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

        String permissionSql = "select permission from test_roles_permissions where role_name = ?";
        jdbcRealm.setPermissionsQuery(permissionSql);

        //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("expworld=>"+ subject.isAuthenticated()); //expworld=>true
        subject.checkRole("user");
        subject.checkPermission("user:del");

       /*
        //用户退出
        subject.logout();
        System.out.println("expworld=>"+ subject.isAuthenticated()); //expworld=>false*/
    }
}
复制代码

 

相关sql:

复制代码
CREATE TABLE users(
    id int,
username VARCHAR(50),
password VARCHAR(50)
);

insert into users values(1,"exp","123456");

CREATE TABLE roles_permissions(
    id int,
    role_name VARCHAR(50),
    permission VARCHAR(50)
);

insert into roles_permissions values(1,"admin","user:select");

CREATE TABLE user_roles(
    id int,
    username VARCHAR(50),
    role_name VARCHAR(50)
);

insert into user_roles values(1,"exp","admin");

CREATE TABLE test_user(
username VARCHAR(50),
password VARCHAR(50)
);

insert into test_user values("xiaoming","654321");
复制代码

 

 pom.xml

 

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>shiro-demo</artifactId>
        <groupId>com.exp</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>shiro-test</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-core</artifactId>
            <version>1.4.0</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>REALEASE</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.45</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.6</version>
        </dependency>
    </dependencies>


</project>
复制代码

 

 

posted @   expworld  阅读(113)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示