Java shiro安全框架使用介绍

yizhihongxing

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连接Hadoop进行编程

    利用Java连接Hadoop进行编程的完整攻略 准备工作 安装开发和运行Hadoop所需的Java环境。推荐使用Java 1.8版本。 下载并解压Hadoop软件包。 配置Hadoop环境变量。 写一个Java程序来连接Hadoop 下面是一个简单的Java程序,它能够连接到Hadoop集群,读取一个文件,并输出每行的内容。该程序主要使用Hadoop的Map…

    Java 2023年5月19日
    00
  • Java接口定义与实现方法分析

    Java接口定义与实现方法分析 什么是接口 Java中的接口(interface)是指一组抽象方法的集合,接口中的所有方法都没有具体的实现。接口用于描述类所支持的协议,类通过实现接口而声明自己符合某个协议。通俗来说,接口定义了一套规范,只要实现了该接口的类都必须按照规范提供具体实现。 接口的定义 public interface SampleInterfac…

    Java 2023年5月26日
    00
  • 详解Spring Boot 目录文件结构

    下面是详解Spring Boot目录文件结构的攻略。 目录文件结构 作为一款快速构建Java Web应用的框架,Spring Boot提供了一套默认的目录结构,旨在帮助开发人员快速搭建应用并进行开发,其目录文件结构如下: project ├── src/main/java │ └── com/example/demo │ ├── controller │ ├…

    Java 2023年5月15日
    00
  • JSP导出Excel文件的方法

    JSP导出Excel文件是一种常见的需求,在这里给出一个JSP导出Excel文件的完整攻略。 1. 准备工作 首先需要引入先关依赖。 jxl.jar (可从网络上下载):jxl是一款专门用于处理Excel文件的java类库,其中包含了读取和写入Excel文件等相关操作。 2. 导出Excel文件的主要过程 (1)定义数据集并填充数据 首先,我们需要定义一个要…

    Java 2023年6月15日
    00
  • Spring如何使用PropertyPlaceholderConfigurer读取文件

    下面是“Spring如何使用PropertyPlaceholderConfigurer读取文件”的完整攻略: PropertyPlaceholderConfigurer简介 在Spring框架中,PropertyPlaceholderConfigurer是常用于读取属性文件(如.properties文件)并进行动态注入的类。我们可以通过该类来替换配置文件中的…

    Java 2023年5月20日
    00
  • Spring-Bean创建对象的步骤方式详解

    下面是详细的“Spring-Bean创建对象的步骤方式详解”的攻略。 1. Spring-Bean创建对象的步骤方式 在Spring中有两种方式可以创建Bean对象,分别是: 使用构造方法 使用工厂方法 1.1 使用构造方法 1.1.1 构造方法注入 在使用构造方法创建Bean对象的时候,可以使用构造方法注入来为对象进行属性赋值。具体步骤如下: 在配置文件中…

    Java 2023年5月26日
    00
  • Java 数据结构与算法系列精讲之背包问题

    Java 数据结构与算法系列精讲之背包问题 背包问题简介 背包问题是计算机科学中的经典问题,旨在找到最佳的物品组合,使得其总重量不超过背包容量,同时总价值最大化。背包问题有多个变体,每个变体都采用不同的解决方法。 01背包 01背包指的是背包容量固定,并且每个物品只有一个的情况。对于n个物品和一个容量为V的背包,每个物品有两个属性:体积w和价值v。该问题可以…

    Java 2023年5月26日
    00
  • jQuery+json实现的简易Ajax调用实例

    下面就详细讲解一下“jQuery+JSON实现的简易Ajax调用实例”的完整攻略。 什么事Ajax? 在讲解“jQuery+JSON实现的简易Ajax调用实例”之前,先来介绍一下Ajax。 Ajax(Asynchronous JavaScript and XML)是一种用于创建快速动态网页的技术。它通过在后台与服务器进行少量数据交换,就可以实现页面无刷新更新…

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