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+MySql图片数据保存与读取的具体实例

    下面我将详细讲解“Java+MySql图片数据保存与读取的具体实例”的完整攻略,并提供两个示例。 1、前置条件 在进行Java+MySql图片数据的保存与读取前,需要保证以下条件已经满足: 已经安装好 Java 开发环境 已经安装好 MySql 数据库,并且能够在 Java 中连接到该数据库 需要使用 JDBC 驱动程序连接 MySql 数据库,可以手动下载…

    Java 2023年5月20日
    00
  • JavaSpringBoot报错“NoSuchMethodError”的原因和处理方法

    当使用Java的Spring Boot框架时,可能会遇到“NoSuchMethodError”错误。这个错误通常是由以下原因之一引起的: 依赖项版本不兼容:如果您的应用程序依赖项版本不兼容,则可能会出现此错误。在这种情况下,需要确保所有依赖项版本兼容。 类或方法名称错误:如果类或方法名称错误,则可能会出现此错误。在这种情况下,需要确保类或方法名称正确。 以下…

    Java 2023年5月5日
    00
  • java中简单的截取分割字符串实例

    那我来详细讲解一下“Java中简单的截取分割字符串实例”的攻略。 什么是字符串? 首先,我们需要明确一下,什么是字符串。在计算机领域中,字符串指的是由零个或多个字符组成的有限序列。 在Java中,字符串是一种特殊类型的对象,由java.lang.String类来实现。Java中的字符串是不可变的,也就是说,我们不能直接修改字符串的内容。但可以使用一些方法来对…

    Java 2023年5月27日
    00
  • java实现二维数组转置的方法示例

    针对”java实现二维数组转置的方法示例”,我为您提供完整攻略如下: 一、题目分析 二维数组转置是将行和列的位置互换,即行变为列,列变为行,其基本原理是通过两层循环,依次交换每一个元素。 二、Java实现方法 Java实现二维数组转置可以按以下步骤进行: 1.定义原始的二维数组: 我们先定义原始的二维数组,一般可以通过随机生成数或者手动初始化等方法来实现。 …

    Java 2023年5月26日
    00
  • 全面解析Hibernate关联操作、查询操作、高级特性、并发处理机制

    全面解析Hibernate关联操作、查询操作、高级特性、并发处理机制 Hibernate是一个流行的Java对象关系映射框架,它可以将Java对象映射到数据库表中。本文将全面介绍Hibernate的四个主要方面:关联操作、查询操作、高级特性和并发处理机制。 关联操作 Hibernate支持多种关联操作,包括一对一、一对多、多对一和多对多关联。下面是一对多关联…

    Java 2023年5月19日
    00
  • jsp中存取session值简单介绍

    下面我将详细讲解“JSP中存取session值简单介绍”的完整攻略。 什么是Session Session是指服务端保存用户信息的一种机制,它可以用来保存用户登录信息、用户偏好设置、购物车、验证码等应用场景。 在JSP中,通过内置的session对象来存储用户信息,这个对象可以在同一浏览器窗口内的多个请求间共享,在用户关闭浏览器窗口时就会失效。 Sessio…

    Java 2023年6月15日
    00
  • mybatis-plus 如何操作json字段

    mybatis-plus 支持操作 JSON 数据类型,官方文档也提供了详细的使用说明,下面我来具体讲解如何操作 JSON 字段的完整攻略,包括如何插入、修改、查询和删除 JSON 数据。 1. 插入 JSON 数据 插入 JSON 数据可以使用 MyBatis-Plus 提供的 com.baomidou.mybatisplus.extension.hand…

    Java 2023年5月26日
    00
  • 详解Java向服务端发送文件的方法

    详解Java向服务端发送文件的方法 在Java编程中,我们经常需要向服务端发送文件,比如我们需要上传用户的头像、简历等等。本文将详细讲解Java向服务端发送文件的方法。 1. 使用Java中的URLConnection发送文件 Java中的URLConnection类可以用来向服务端发送文件。下面是示例代码: import java.io.File; imp…

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