spring boot 集成 shiro 自定义密码验证 自定义freemarker标签根据权限渲染不同页面(推荐

Spring Boot 集成 Shiro

在 Spring Boot 中集成 Shiro 需要以下步骤:

  1. 引入依赖。在 pom.xml 中添加以下依赖:

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

  1. 配置 Shiro。在配置类中添加以下内容:

```java
@Configuration
public class ShiroConfig {
@Bean
public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
shiroFilterFactoryBean.setSecurityManager(securityManager);
return shiroFilterFactoryBean;
}

   @Bean
   public SecurityManager securityManager() {
       DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
       securityManager.setRealm(myRealm());
       return securityManager;
   }

   @Bean
   public MyRealm myRealm() {
       MyRealm myRealm = new MyRealm();
       myRealm.setCredentialsMatcher(hashedCredentialsMatcher());
       return myRealm;
   }

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

}
```

在上述配置中,shirFiltersecurityManager 是 Shiro 的基本配置,需要注入 SecurityManager 对象。在 SecurityManager 对象中设置 Realm,myRealm 是自定义的 Realm。

  1. 自定义 Realm。在自定义的 Realm 中实现 doGetAuthenticationInfo 方法验证用户信息和 doGetAuthorizationInfo 方法获取用户权限。

自定义密码验证

在自定义的 Realm 中配置验证密码的方式:

public class MyRealm extends AuthorizingRealm {
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;
        String username = usernamePasswordToken.getUsername();

        // 根据用户名从数据库中获取用户信息
        User user = userDao.findByUsername(username);

        if (user == null) {
            throw new UnknownAccountException();
        }

        // 密码加密方式
        String salt = user.getSalt();
        String password = new String(usernamePasswordToken.getPassword());
        String encryptPassword = new SimpleHash("md5", password, salt, 2).toHex();

        if (!user.getPassword().equals(encryptPassword)) {
            throw new IncorrectCredentialsException();
        }

        return new SimpleAuthenticationInfo(user, user.getPassword(), ByteSource.Util.bytes(user.getSalt()), getName());   
    }
}

在上述代码中,使用的是 MD5 加密验证密码,加密方式为:将密码和盐值进行加密,加密次数为 2 次。

自定义 Freemarker 标签根据权限渲染不同页面

在 Freemarker 中自定义标签可以使用 TemplateDirectiveModel 接口。自定义标签需要实现该接口中的 execute 方法来完成标签功能。以下是一个简单的自定义标签。

public class MyTag implements TemplateDirectiveModel {
    @Override
    public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException {
        String permission = params.get("permission").toString();
        Subject subject = SecurityUtils.getSubject();

        if (subject.isPermitted(permission)) {
            body.render(env.getOut());
        }
    }
}

在上述代码中,获取标签参数 permissionSubject 对象,利用 isPermitted 方法判断当前用户是否有该权限,如果有则渲染标签体,否则不渲染。

可以将以上的自定义标签添加到 Freemarker 的配置中:

@Configuration
public class FreemarkerConfig {
    @Bean
    public FreeMarkerConfigurer freeMarkerConfigurer() {
        FreeMarkerConfigurer freeMarkerConfigurer = new FreeMarkerConfigurer();
        freeMarkerConfigurer.setTemplateLoaderPath("/templates/");
        freeMarkerConfigurer.setDefaultEncoding("UTF-8");

        // 添加自定义标签
        Map<String, Object> freemarkerVariables = new HashMap<>();
        freemarkerVariables.put("myTag", new MyTag());
        freeMarkerConfigurer.setFreemarkerVariables(freemarkerVariables);
        return freeMarkerConfigurer;
    }
}

这样就可以在 Freemarker 中使用自定义标签,根据当前用户的权限渲染不同的页面。

示例代码:https://github.com/HaoShiWang/spring-boot-shiro-freemarker

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:spring boot 集成 shiro 自定义密码验证 自定义freemarker标签根据权限渲染不同页面(推荐 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 基于Java实现Socket编程入门

    让我来为大家详细讲解“基于Java实现Socket编程入门”的完整攻略。 什么是Socket编程 Socket编程是网络编程的基础,它允许不同设备之间基于网络相互通信。Socket编程使用TCP和UDP协议来传输数据,它们是传输控制协议(TCP)和用户数据报协议(UDP)。在Socket编程中,设备被称为“主机”或“客户机”。 Socket编程的四个基本任务…

    Java 2023年5月19日
    00
  • SpringBoot整合mybatis的方法详解

    下面我来为你详细讲解“SpringBoot整合mybatis的方法详解”的完整攻略。 准备工作 在maven中引入spring-boot-starter-jdbc、mybatis-spring-boot-starter、mysql-connector-java等依赖。 在application.properties中配置数据库信息和mybatis配置。 sp…

    Java 2023年5月19日
    00
  • Struts2学习笔记(6)-简单的数据校验

    针对这个话题,下面是一份完整攻略。 Struts2学习笔记(6)-简单的数据校验 前言 在Struts2中,数据校验是开发过程中不可缺少的一部分,而Struts2提供了全面而且灵活的校验机制来实现数据校验。在这篇文章中,我们将介绍Struts2中简单的数据校验。 配置数据校验 Struts2的校验机制主要是通过在Action类中定义方法进行校验,校验方法必须…

    Java 2023年5月20日
    00
  • Spring Security代码实现JWT接口权限授予与校验功能

    为了实现JWT接口权限授予与校验功能,我们需要以下步骤: 1. 添加Spring Security和JWT依赖 Spring Security是一个现成的身份验证和授权框架,而JWT是一种安全性较高的身份认证方式。因此,我们需要添加相关依赖来支持这些功能。可以在Maven或Gradle中添加以下依赖: <dependencies> … &lt…

    Java 2023年5月20日
    00
  • Java集合-HashMap

    Java集合-HashMap HashMap是Java集合框架中最常用的数据结构之一,它基于哈希表实现,在插入、删除、查找等操作上具有很高效的表现。本文将详细讲解HashMap的使用方法和具体实现。 HashMap的特点 HashMap是一种无序的数据结构,它存储的键值对是没有顺序的。 它允许一条记录的键和值来自不同的映射表,例如,键可以是String类型,…

    Java 2023年5月26日
    00
  • Springboot jar文件如何打包zip在linux环境运行

    这里就为您详细讲解如何将Spring Boot应用打包成Jar文件并在Linux环境中部署运行。 1. 生成Jar包 在使用Maven进行构建的项目中,我们可以使用以下Maven命令将应用程序打包成可执行的Jar文件: mvn clean package 执行该命令后,Maven将会在target目录下生成一个可执行的Jar包,其名称通常为{artifact…

    Java 2023年5月19日
    00
  • java7 新I/O知识点详解

    Java7 新 I/O 知识点详解 介绍 Java7 引入了一些新的 I/O(输入输出)特性,主要是为了优化文件 I/O 操作,使之更加高效和灵活。其中主要包括以下几个方面: 支持异步 I/O 操作的 NIO API 支持读取和写入字符串的 NIO API 自动资源管理(ARM)特性,即 try-with-resources 操作 文件系统的改进 下面将分别…

    Java 2023年5月24日
    00
  • sublime text 3 快捷键大全以及配置编译环境

    Sublime Text 3 快捷键大全以及配置编译环境 Sublime Text 3 是一款功能强大的文本编辑器,可以帮助开发者提高工作效率。在本文中,我们将讲解 Sublime Text 3 的快捷键大全以及如何配置编译环境。 Sublime Text 3 快捷键大全 Sublime Text 3 支持各种快捷键操作,以下是一些常用快捷键列表。 快捷键 …

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