shiro认证方式介绍
【摘要】 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)