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字符串拼接的五种方法及性能比较分析(从执行100次到90万次)

    这里给您讲解一下“Java字符串拼接的五种方法及性能比较分析(从执行100次到90万次)”的完整攻略。 标题 Java字符串拼接的五种方法及性能比较分析(从执行100次到90万次) 内容 前言 随着Java开发的广泛应用,字符串拼接也成为了Java开发中不可避免的一个问题。在这篇文章中,我们将介绍Java中五种常见的字符串拼接方法,包括基本字符串拼接、Str…

    Java 2023年5月26日
    00
  • 详解JAVA中的OPTIONAL

    详解JAVA中的Optional Java中的Optional是Java8中新增的类,用于解决空指针异常。Optional类通过包装对象的形式,判断对象是否为空,从而避免空指针异常。 Optional基本概念 Optional的创建 Optional的创建有两种方法:empty()和of(T value)。 当要创建一个空的Optional对象时,可以使用e…

    Java 2023年5月26日
    00
  • Java Calendar日历类的使用介绍

    当我们需要对日期进行计算时,Java中的Calendar类就变得很有用了。本文将介绍如何使用Calendar类进行日期的相关操作。 什么是Calendar类 Calendar是Java日期时间的中心类。它提供了查询日期、时间、周等日历字段(如YEAR、MONTH、DAY_OF_MONTH、HOUR)以及将时间转换为指定格式的方法。底层实现是Gregorian…

    Java 2023年5月20日
    00
  • 内存溢出的原因是什么?

    内存溢出是指当程序在执行过程中需要申请更多的内存,但可用内存已经全部被占用时,程序便无法再申请到更多的内存,导致程序崩溃或异常退出。内存溢出的原因主要有以下几点: 内存泄漏:当程序申请内存后,由于某种原因导致程序在使用完内存后没有及时释放,这部分内存就会被占用并且一直保留着,导致内存空间被占满,从而引起内存泄漏。 示例一: public class Memo…

    Java 2023年5月10日
    00
  • 之前很火给女朋友推送微信服务号消息是怎么做的?

    经过了几天的奋战,终于把微信服务号的模板消息给写完了。后端其实没花多少时间,因为之前已经有同学提过pull request了,我在这基础之上简单优化下就完事了,主要的时间都是花在前端上,对前端页面和参数的适配比较麻烦。 消息推送平台?推送下发【邮件】【短信】【微信服务号】【微信小程序】【企业微信】【钉钉】等消息类型。 https://gitee.com/zh…

    Java 2023年4月18日
    00
  • gson对象序列化的示例

    下面我将为你详细讲解“gson对象序列化的示例”的完整攻略,包含以下内容: 什么是gson对象序列化 Gson库的导入 Gson对象序列化的基本使用方法 Gson对象序列化的示例 Gson数组序列化的示例 1. 什么是gson对象序列化 Gson是Google发布的Java开源库,用于将Java对象转成对应的JSON(JavaScript Object No…

    Java 2023年5月26日
    00
  • SpringBoot整合MyBatis-Plus3.1教程详解

    下面是“SpringBoot整合MyBatis-Plus3.1教程详解”的完整攻略。本文主要分为以下几个部分: 前置知识 环境准备 导入依赖 配置数据源 定义实体类 定义Mapper接口 CRUD操作示例1 CRUD操作示例2 1. 前置知识 在学习本教程之前,需要对SpringBoot和MyBatis-Plus有一定的了解。如果你还不熟悉这两个框架的基本使…

    Java 2023年5月20日
    00
  • java遇到微信小程序 “支付验证签名失败” 问题解决

    下面是详细讲解“java遇到微信小程序 “支付验证签名失败” 问题解决”的完整攻略: 问题原因 在进行微信小程序支付时,如果出现“支付验证签名失败”的提示,一般是由于使用了错误的签名方式或者参数传递不正确。 解决方法 1. 首先确认参数传递是否正确 在进行支付前,需要将相关的参数传递给后端进行处理,并作为请求参数发送至微信支付平台。在此过程中,可能会出现参数…

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