Java shiro安全框架使用介绍

Java shiro安全框架使用介绍

概述

Java Shiro框架是一个简单易用的Java安全框架,它提供了身份验证、授权、会话管理等通用安全服务,可以轻松地集成到各种应用中。本文将介绍Java Shiro框架的使用方法和示例。

安装

Maven依赖

在pom.xml文件中添加以下依赖:

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

Jar包引入

下载shiro-core.jar,并添加到项目的classpath中。

基本使用

1. 配置文件

在classpath下创建一个名为shiro.ini的文件,写入如下内容:

[users]
# 用户名=密码,角色1,角色2...
admin=123456, admin_role
user=123456, user_role

[roles]
# 角色名=权限列表,多个用逗号分隔
admin_role=user:create,user:update,user:delete,user:view
user_role=user:view

#URL映射到权限
[urls]
/#/login = anon
/#/register = anon
/#/user/** = roles[user_role]
/#/admin/** = roles[admin_role]

以上是一个简单的shiro.ini配置文件,其中包含了一些用户、角色和权限的定义以及URL映射到权限的配置。

2. 身份验证

使用Shiro进行身份验证需要先创建一个Subject对象,并将用户输入的用户名和密码传递给Subject的login方法。

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

//用户输入的用户名和密码
String username = "admin";
String password = "123456";

//调用login方法进行身份验证
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
currentUser.login(token);

如果用户输入的用户名和密码与定义在shiro.ini文件中的用户信息匹配,则登录成功,否则会抛出AuthenticationException异常。

3. 授权

使用Shiro进行授权需要先创建一个Subject对象,并调用isPermitted或checkPermission方法进行权限检查。

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

//用于判断用户是否具有指定的权限
String permission = "user:create";

//判断用户是否具有指定权限
if (currentUser.isPermitted(permission)) {
    //具有权限
} else {
    //没有权限
}

Shiro提供了两种判断权限的方式,isPermitted和checkPermission。isPermitted方法会返回一个boolean值来表示用户是否具有指定的权限,checkPermission方法则会抛出UnauthorizedException异常来表示用户没有指定的权限。

示例

示例1:Spring Boot集成Shiro

@Configuration
public class ShiroConfig {

    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager securityManager) {
        ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
        factoryBean.setSecurityManager(securityManager);
        factoryBean.setLoginUrl("/login");
        factoryBean.setSuccessUrl("/index");
        factoryBean.setUnauthorizedUrl("/403");
        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
        filterChainDefinitionMap.put("/login", "anon");
        filterChainDefinitionMap.put("/logout", "logout");
        filterChainDefinitionMap.put("/**", "authc");
        factoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
        return factoryBean;
    }

    @Bean
    public DefaultWebSecurityManager securityManager(Realm realm) {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(realm);
        return securityManager;
    }

    @Bean
    public Realm realm() {
        ShiroRealm shiroRealm = new ShiroRealm();
        shiroRealm.setCredentialsMatcher(hashedCredentialsMatcher());
        return shiroRealm;
    }

    @Bean
    public HashedCredentialsMatcher hashedCredentialsMatcher() {
        HashedCredentialsMatcher credentialsMatcher = new HashedCredentialsMatcher();
        credentialsMatcher.setHashAlgorithmName("md5");
        credentialsMatcher.setHashIterations(2);
        return credentialsMatcher;
    }

}

public class ShiroRealm extends AuthorizingRealm {

    @Autowired
    private UserService userService;

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        Set<String> roleNames = userService.getRoleNamesByUsername((String) principals.getPrimaryPrincipal());
        info.setRoles(roleNames);
        Set<String> permissions = userService.getPermissionNamesByUsername((String) principals.getPrimaryPrincipal());
        info.setStringPermissions(permissions);
        return info;
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;
        String username = usernamePasswordToken.getUsername();
        String password = new String(usernamePasswordToken.getPassword());
        User user = userService.getUserByUsername(username);
        if (user == null) {
            throw new UnknownAccountException("用户不存在");
        }
        if (!password.equals(user.getPassword())) {
            throw new IncorrectCredentialsException("用户名或密码错误");
        }
        SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(username, password, getName());
        return info;
    }

}

@RestController
public class UserController {

    @GetMapping("/user")
    public String user() {
        return "User Page!";
    }

    @GetMapping("/admin")
    public String admin() {
        return "Admin Page!";
    }

}

以上是一个使用Spring Boot集成Shiro的示例,示例中定义了一个ShiroConfig类用于配置Shiro,另外还定义了一个ShiroRealm类用于身份验证和授权,最后在控制器中添加了两个用于测试的API。

示例2:使用Shiro进行密码加密

public class PasswordUtil {

    private static final String SALT = "my_salt";

    public static String encryptPassword(String password) {
        String hashAlgorithmName = "MD5";
        int hashIterations = 2;
        SimpleHash hash = new SimpleHash(hashAlgorithmName, password, SALT, hashIterations);
        return hash.toString();
    }

}

以上是一个小例子,用来演示如何使用Shiro进行密码加密。示例中使用MD5算法对原始密码进行加密,加密时设置了一个Salt值和迭代次数,生成一个128位的密码串。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java shiro安全框架使用介绍 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • java运行shell脚本方法示例

    Java运行shell脚本方法 Java可以通过ProcessBuilder,Runtime和Process三种方式运行操作系统的命令,包括执行shell脚本。下面将详细讲解如何使用Java运行shell脚本。 方法一:ProcessBuilder ProcessBuilder可以创建一个进程来执行操作系统命令。可以通过设置ProcessBuilder的参数…

    Java 2023年5月23日
    00
  • Java编程ssh整合常见错误解析

    Java编程SSH整合常见错误解析 SSH(Struts2+Spring3+Hibernate3)是目前Java企业级Web应用开发中比较流行的一种技术架构,尤其是在传统JSP+Servlet的基础上,尤其是对于Java初学者来说,它的学习曲线相对来说比较平滑。然而在SSH的整合过程中,由于各种原因,很容易出现各种错误,本文将一一进行详细介绍。 错误一:Cl…

    Java 2023年5月20日
    00
  • 详解SpringBoot项目整合Vue做一个完整的用户注册功能

    我们来详细讲解一下“详解SpringBoot项目整合Vue做一个完整的用户注册功能”。这个攻略分两个部分:服务器端和客户端。我们分别来讲解。 服务器端 1. 创建SpringBoot项目 首先,我们需要在IDE中创建一个SpringBoot项目。可以使用Spring Initializr创建一个简单的Java Web项目,或者自己使用Maven创建。 2. …

    Java 2023年5月20日
    00
  • ibatis学习之搭建Java项目

    下面是关于“ibatis学习之搭建Java项目”的完整攻略: 第一步:项目环境搭建 在开始使用ibatis进行Java开发之前,我们首先需要搭建好开发环境,包括: 安装JDK环境:首先需要安装Java Development Kit(JDK),并配置好环境变量。 安装Eclipse IDE:选择一个常用的IDE,如Eclipse IDE,安装并配置好开发环境…

    Java 2023年5月19日
    00
  • SpringBoot如何在运行时动态添加数据源

    让我们来详细讲解一下Spring Boot如何在运行时动态添加数据源。 1. 引入依赖 在开始之前,我们需要引入Spring Boot的依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-sta…

    Java 2023年6月3日
    00
  • JAVA实现301永久重定向方法

    Java实现301永久重定向的方法需要在服务器端进行配置。下面是具体的步骤: 1. 配置web.xml文件 在web.xml文件中添加以下代码,该代码将对匹配的URL进行永久重定向 <web-app> <error-page> <error-code>301</error-code> <location&…

    Java 2023年6月15日
    00
  • Java实现数据库连接池的方法

    Java实现数据库连接池是一种提高性能和应用程序响应能力的有效方法。下面为大家介绍几种常见的Java实现数据库连接池的方法。 使用Apache DBCP实现连接池 Apache DBCP是Java中最常用的开源连接池之一,它是一个开源项目,由Apache软件基金会支持。它使用轻量级语言Java实现,可以通过简单的配置使用。下面是使用Apache DBCP实现…

    Java 2023年5月19日
    00
  • 深入了解JAVA数据类型与运算符

    深入了解JAVA数据类型与运算符 JAVA数据类型 JAVA中的数据类型分为两类,基本数据类型和引用数据类型。 基本数据类型 JAVA的基本数据类型包括以下8种: byte:1字节,范围-128~127 short:2字节,范围-32768~32767 int:4字节,范围-2147483648~2147483647 long:8字节,范围-92233720…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部