shiro认证方式介绍

举报
林欣 发表于 2025/05/25 18:25:56 2025/05/25
【摘要】 Apache Shiro 支持多种认证方式,包括基于用户名/密码、自定义 Realm、第三方系统(如 LDAP、Active Directory)等。以下是几种常见的认证方式及其使用示例: 1. 基于用户名/密码的认证这是最常见的认证方式,通常通过 UsernamePasswordToken 实现。 示例代码:import org.apache.shiro.SecurityUtils;imp...

Apache Shiro 支持多种认证方式,包括基于用户名/密码、自定义 Realm、第三方系统(如 LDAP、Active Directory)等。以下是几种常见的认证方式及其使用示例:


1. 基于用户名/密码的认证

这是最常见的认证方式,通常通过 UsernamePasswordToken 实现。

示例代码:

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;

public class UsernamePasswordAuthDemo {
    public static void main(String[] args) {
        // 获取当前用户
        Subject currentUser = SecurityUtils.getSubject();

        // 创建用户名/密码 Token
        UsernamePasswordToken token = new UsernamePasswordToken("username", "password");

        try {
            // 执行认证
            currentUser.login(token);
            System.out.println("认证成功!");
        } catch (Exception e) {
            System.out.println("认证失败:" + e.getMessage());
        }
    }
}

2. 自定义 Realm 认证

如果需要自定义认证逻辑(例如从数据库获取用户信息),可以实现 Realm 接口。

自定义 Realm 示例:

import org.apache.shiro.authc.*;
import org.apache.shiro.realm.Realm;

public class CustomRealm implements Realm {
    @Override
    public String getName() {
        return "CustomRealm";
    }

    @Override
    public boolean supports(AuthenticationToken token) {
        return token instanceof UsernamePasswordToken;
    }

    @Override
    public AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        UsernamePasswordToken upToken = (UsernamePasswordToken) token;
        String username = upToken.getUsername();
        String password = new String(upToken.getPassword());

        // 模拟从数据库获取用户信息
        if (!"admin".equals(username) || !"123456".equals(password)) {
            throw new UnknownAccountException("用户名或密码错误");
        }

        // 返回认证信息(用户名、密码、盐、Realm 名称)
        return new SimpleAuthenticationInfo(username, password, getName());
    }
}

配置 Shiro 使用自定义 Realm:

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;

public class CustomRealmDemo {
    public static void main(String[] args) {
        // 配置 SecurityManager
        Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
        SecurityManager securityManager = factory.getInstance();
        SecurityUtils.setSecurityManager(securityManager);

        // 获取当前用户
        Subject currentUser = SecurityUtils.getSubject();

        // 创建用户名/密码 Token
        UsernamePasswordToken token = new UsernamePasswordToken("admin", "123456");

        try {
            // 执行认证
            currentUser.login(token);
            System.out.println("认证成功!");
        } catch (Exception e) {
            System.out.println("认证失败:" + e.getMessage());
        }
    }
}

shiro.ini 配置文件:

[main]
customRealm = com.example.CustomRealm
securityManager.realms = $customRealm

3. 集成 LDAP 认证

Shiro 支持与 LDAP 集成,用于企业级系统的认证。

示例代码:

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;

public class LdapAuthDemo {
    public static void main(String[] args) {
        // 配置 SecurityManager
        Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro-ldap.ini");
        SecurityManager securityManager = factory.getInstance();
        SecurityUtils.setSecurityManager(securityManager);

        // 获取当前用户
        Subject currentUser = SecurityUtils.getSubject();

        // 创建用户名/密码 Token
        UsernamePasswordToken token = new UsernamePasswordToken("username", "password");

        try {
            // 执行认证
            currentUser.login(token);
            System.out.println("认证成功!");
        } catch (Exception e) {
            System.out.println("认证失败:" + e.getMessage());
        }
    }
}

shiro-ldap.ini 配置文件:

[main]
ldapRealm = org.apache.shiro.realm.ldap.JndiLdapRealm
ldapRealm.url = ldap://localhost:389
ldapRealm.contextFactory.url = ldap://localhost:389
ldapRealm.userDnTemplate = uid={0},ou=users,dc=example,dc=com

4. 记住我(RememberMe)功能

Shiro 支持“记住我”功能,允许用户在关闭浏览器后重新登录时无需再次输入凭据。

示例代码:

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;

public class RememberMeDemo {
    public static void main(String[] args) {
        // 获取当前用户
        Subject currentUser = SecurityUtils.getSubject();

        // 创建用户名/密码 Token,并启用“记住我”功能
        UsernamePasswordToken token = new UsernamePasswordToken("username", "password");
        token.setRememberMe(true);

        try {
            // 执行认证
            currentUser.login(token);
            System.out.println("认证成功!");
        } catch (Exception e) {
            System.out.println("认证失败:" + e.getMessage());
        }
    }
}

总结

以上是 Shiro 中几种常见的认证方式及其使用示例。Shiro 的灵活性使其能够轻松集成到各种应用程序中,并根据需求选择合适的认证方式。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。