Shiro 是一个 Java 安全框架,可以用来实现身份验证、授权、加密等安全相关的功能。它提供了一套简单易用的 API,可以与任意 Java 应用程序集成。下面介绍如何使用 Shiro 实现身份验证和授权。

  1. 添加 Shiro 依赖

在 Maven 项目中,可以通过添加以下依赖来引入 Shiro:

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-core</artifactId>
    <version>1.7.1</version>
</dependency>
  1. 编写 Shiro 配置文件

Shiro 配置文件可以用来配置安全相关的组件,如 Realm、Session 管理器、加密算法等。可以通过以下方式创建一个 shiro.ini 配置文件:

[main]
# 定义 Realm
myRealm = com.example.MyRealm
# 定义 Session 管理器
mySessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager
# 定义 Cookie
myCookie = org.apache.shiro.web.servlet.SimpleCookie
myCookie.name = myCookieName
myCookie.httpOnly = true
myCookie.maxAge = 86400
# 定义加密算法
myHash = org.apache.shiro.crypto.hash.SimpleHash
myHash.algorithmName = SHA-256
myHash.iterations = 1000

# 配置 Realm
securityManager.realm = $myRealm

# 配置 Session 管理器
securityManager.sessionManager = $mySessionManager
sessionManager.sessionDAO = org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO
sessionManager.sessionIdCookie = $myCookie
sessionManager.sessionIdCookieEnabled = true
sessionManager.globalSessionTimeout = 1800000

# 配置加密算法
passwordService.hashAlgorithmName = $myHash.algorithmName
passwordService.hashIterations = $myHash.iterations
  1. 实现 Realm

Realm 是 Shiro 中最重要的组件之一,它负责从数据源中获取用户信息和权限信息,并将这些信息提供给 Shiro 进行身份验证和授权。可以通过继承 org.apache.shiro.realm.Realm 接口来实现自己的 Realm。

下面是一个简单的 Realm 实现,它从一个 Map 中获取用户信息和权限信息:

public class MyRealm implements Realm {
    private Map<String, String> users = new HashMap<>();
    private Map<String, Set<String>> permissions = new HashMap<>();

    public MyRealm() {
        users.put("admin", "admin");
        permissions.put("admin", new HashSet<>(Arrays.asList("user:list", "user:add", "user:delete")));
    }

    @Override
    public String getName() {
        return "myRealm";
    }

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

    @Override
    public AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        String username = (String) token.getPrincipal();
        String password = new String((char[]) token.getCredentials());

        if (!users.containsKey(username) || !users.get(username).equals(password)) {
            throw new IncorrectCredentialsException();
        }

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

    @Override
    public AuthorizationInfo getAuthorizationInfo(PrincipalCollection principals) {
        String username = (String) principals.getPrimaryPrincipal();

        SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
        authorizationInfo.addRoles(Collections.singleton("admin"));
        authorizationInfo.addStringPermissions(permissions.get(username));

        return authorizationInfo;
    }
}
  1. 使用 Shiro 进行身份验证和授权

要使用 Shiro 进行身份验证和授权,可以通过以下方式:

// 创建 SecurityManager
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager securityManager = factory.getInstance();

// 绑定 SecurityManager 到当前线程
SecurityUtils.setSecurityManager(securityManager);

// 获取 Subject
Subject subject = SecurityUtils.getSubject();

// 调用登录方法进行身份验证
UsernamePasswordToken token = new UsernamePasswordToken("admin", "admin");
subject.login(token);

// 调用授权方法进行授权
assertTrue(subject.hasRole("admin"));
assertTrue(subject.isPermitted("user:list"));
shiro实现

原文地址: https://www.cveoy.top/t/topic/ucR 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录