1. 首页
  2. 软件开发
  3. Shiro自定义登录认证

Shiro自定义登录认证

  • 发布于 2024-08-17
  • 0 次阅读

自定义登录认证是指开发人员可以根据自己的需求和业务逻辑,定制化用户身份验证的流程。在Shiro中,可以通过实现 Authenticator 接口来自定义登录认证逻辑。

代码如下:

1. 创建自定义Realm

首先,需要创建一个自定义的Realm,继承 AuthorizingRealm 类并实现 doGetAuthenticationInfo 方法来自定义用户身份验证逻辑。

import org.apache.shiro.authc.*;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;

public class CustomRealm extends AuthorizingRealm {
   

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
   
        UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;
        String username = usernamePasswordToken.getUsername();
        String password = new String(usernamePasswordToken.getPassword());

        // 根据用户名查询数据库或其他数据源获取用户信息
        if (!"user1".equals(username)) {
   
            throw new UnknownAccountException("用户名不存在");
        }
        
        // 模拟数据库中存储的密码为"password1"
        String storedPassword = "password1";
        if (!password.equals(storedPassword)) {
   
            throw new IncorrectCredentialsException("密码错误");
        }

        return new SimpleAuthenticationInfo(username, password, getName());
    }
}

2. 配置Shiro

在Shiro的配置文件中配置自定义Realm。

import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.realm.Realm;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;

public class ShiroConfig {
   

    public SecurityManager securityManager() {
   
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(customRealm());
        return securityManager;
    }

    public Realm customRealm() {
   
        return new CustomRealm();
    }
}

3. 编写登录验证逻辑

编写一个简单的登录验证逻辑,使用Subject进行身份验证。

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;

public class LoginService {
   

    public void login(String username, String password) {
   
        SecurityManager securityManager = new IniSecurityManagerFactory("classpath:shiro.ini").getInstance();
        SecurityUtils.setSecurityManager(securityManager);
        Subject currentUser = SecurityUtils.getSubject();

        if (!currentUser.isAuthenticated()) {
   
            UsernamePasswordToken token = new UsernamePasswordToken(username, password);
            try {
   
                currentUser.login(token);
                System.out.println("Login successful!");
            } catch (AuthenticationException e) {
   
                System.out.println("Login failed: " + e.getMessage());
            }
        }
    }
}

4. 测试自定义登录认证

编写一个简单的测试代码来测试自定义登录认证功能。

public class Main {
   
    
    public static void main(String[] args) {
   
        LoginService loginService = new LoginService();
        loginService.login("user1", "password1");
    }
}

通过以上代码示例,实现了自定义登录认证的功能,包括创建自定义Realm、配置Shiro、编写登录验证逻辑和测试自定义登录认证。

原文链接: https://blog.csdn.net/2401_82884096/article/details/138359751