springmvc+shiro+maven 实现登录认证与权限授权管理

接下来我将为您详细讲解“springmvc+shiro+maven 实现登录认证与权限授权管理”的完整攻略。

1. 环境准备

首先需要搭建好SpringMVC和Maven的环境,可使用IDEA等开发工具自行创建空白项目。

2. pom.xml配置

为项目引入SpringMVC和Shiro的依赖包,具体如下:

<!--SpringMVC依赖包-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>5.3.10</version>
</dependency>

<!-- Shiro依赖包 -->
<dependency>
  <groupId>org.apache.shiro</groupId>
  <artifactId>shiro-web</artifactId>
  <version>1.7.1</version>
</dependency>
<dependency>
  <groupId>org.apache.shiro</groupId>
  <artifactId>shiro-spring</artifactId>
  <version>1.7.1</version>
</dependency>

3.配置Shiro

在SpringMVC的Web.xml配置文件中添加Shiro的Filter:

<filter>
  <filter-name>ShiroFilter</filter-name>
  <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>ShiroFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

然后在SpringMVC的applicationContext.xml中配置Shiro的相关bean:

<!-- Shiro的安全管理器 -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
  <property name="realm" ref="myRealm"/>
</bean>

<!-- 自定义的Realm -->
<bean id="myRealm" class="com.example.MyRealm"/>

<!-- Shiro的过滤器链 -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
  <property name="securityManager" ref="securityManager"/>
  <property name="loginUrl" value="/login"/>
  <property name="successUrl" value="/index"/>
  <property name="unauthorizedUrl" value="/unauthorized"/>
  <property name="filterChainDefinitions">
    <value>
      /login = anon
      /static/** = anon
      /** = authc
    </value>
  </property>
</bean>

其中,myRealm是自定义的Realm实现认证和权限授权逻辑。filterChainDefinitions定义了Shiro的URL过滤器链,其中login、static目录下的静态文件等不需要认证,其余URL都需要进行认证和权限授权。

4. 自定义Realm

自定义Realm需要继承org.apache.shiro.realm.AuthorizingRealm类,并实现doGetAuthorizationInfo和doGetAuthenticationInfo两个方法实现权限授权和认证逻辑。示例代码如下:

public class MyRealm extends AuthorizingRealm {
    /**
     * 授权逻辑
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
        String username = (String) principalCollection.getPrimaryPrincipal();
        if ("admin".equals(username)) {
            authorizationInfo.addRole("admin");
            authorizationInfo.addStringPermission("user:query");
            authorizationInfo.addStringPermission("user:add");
            authorizationInfo.addStringPermission("user:delete");
            authorizationInfo.addStringPermission("user:update");
        } else if ("user".equals(username)) {
            authorizationInfo.addRole("user");
            authorizationInfo.addStringPermission("user:query");
        }
        return authorizationInfo;
    }

    /**
     * 认证逻辑
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        //获取用户输入的账号和密码
        String username = (String) authenticationToken.getPrincipal();
        String password = new String((char[]) authenticationToken.getCredentials());

        if("admin".equals(username) && "123456".equals(password)){
            return new SimpleAuthenticationInfo(username, password, getName());
        }else if("user".equals(username) && "123456".equals(password)){
            return new SimpleAuthenticationInfo(username, password, getName());
        }
        throw new AuthenticationException("账号或密码错误");
    }
}

5. 编写登录页面

登录页面的代码如下示例,其中包含了用户名、密码、记住我等表单元素:

<form class="form-signin" method="post" action="${pageContext.request.contextPath}/login">
    <h2 class="form-signin-heading">请登录</h2>
    <label for="inputEmail" class="sr-only">用户名</label>
    <input type="text" id="inputEmail" name="username" class="form-control" placeholder="请输入用户名" required autofocus>
    <label for="inputPassword" class="sr-only">密码</label>
    <input type="password" id="inputPassword" name="password" class="form-control" placeholder="请输入密码" required>
    <div class="checkbox">
        <label>
            <input type="checkbox" name="rememberMe" value="true"> 记住我
        </label>
    </div>
    <button class="btn btn-lg btn-primary btn-block" type="submit">登录</button>
</form>

6. 编写用户中心页面

用户中心页面包含了查询、添加、修改、删除等权限授权功能。示例代码如下:

<a href="${pageContext.request.contextPath}/user/query">查询用户</a>
<a href="${pageContext.request.contextPath}/user/add">添加用户</a>
<a href="${pageContext.request.contextPath}/user/update">修改用户</a>
<a href="${pageContext.request.contextPath}/user/delete">删除用户</a>

7. 编写相应的Controller

编写相应的Controller,具体的控制逻辑由Shiro和自定义的Realm来完成,Controller仅仅负责路由。示例代码如下:

@Controller
public class UserController {
    @RequestMapping("/user/query")
    public String query() {
        return "user/query";
    }

    @RequestMapping("/user/add")
    public String add() {
        return "user/add";
    }

    @RequestMapping("/user/update")
    public String update() {
        return "user/update";
    }

    @RequestMapping("/user/delete")
    public String delete() {
        return "user/delete";
    }

    @RequestMapping("/login")
    public String login() {
        return "login";
    }

    @RequestMapping("/index")
    public String index() {
        return "index";
    }

    @RequestMapping("/unauthorized")
    public String unauthorized() {
        return "unauthorized";
    }
}

以上就是整个“springmvc+shiro+maven 实现登录认证与权限授权管理”的完整攻略。如果您需要了解更多相关的内容,可以在代码中添加相应的注释,或者查看相关的官方文档和教程。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springmvc+shiro+maven 实现登录认证与权限授权管理 - Python技术站

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

相关文章

  • Java Scanner输入两个数组的方法

    为了使用Scanner输入两个数组,可以按照以下步骤进行操作: 1. 导入Scanner类 在Java中,使用Scanner来读取用户的输入。因此,首先在文件中导入Scanner类。可以使用以下代码实现此操作: import java.util.Scanner; 2. 创建Scanner对象 一旦导入Scanner类,接下来就需要创建Scanner对象。可以…

    Java 2023年5月26日
    00
  • SpringBoot项目实战之加载和读取资源文件

    下面我将详细讲解“SpringBoot项目实战之加载和读取资源文件”的完整攻略。 加载资源文件 加载classpath中的资源文件 在SpringBoot项目中,我们可以使用ClassLoader来读取classpath中的资源文件,例如: InputStream inputStream = this.getClass().getClassLoader().…

    Java 2023年6月2日
    00
  • SpringBoot 创建web项目并部署到外部Tomcat

    下面是关于SpringBoot创建Web项目并部署到外部Tomcat的攻略。 1. 创建SpringBoot项目 首先,我们需要创建一个SpringBoot Web项目。在这里,我们可以使用Spring Initializr,它是一个基于Web的Spring Boot项目生成器,可以快速构建Spring Boot项目。 具体来说,可以按照以下步骤创建Spri…

    Java 2023年5月19日
    00
  • 详解SpringBoot是如何整合SpringDataRedis的?

    首先需要了解Spring Boot和Spring Data Redis的概念: Spring Boot是Spring Framework的一个开源轻量级框架,可用于构建基于Java的Web应用程序,它提供了自动化的配置和快速的应用程序启动能力。 Spring Data Redis是Spring Data家族框架之一,提供了简单的方式与Redis数据库进行集成…

    Java 2023年5月20日
    00
  • java排序算法之冒泡排序

    Java排序算法之冒泡排序是一种简单的排序算法,它通过比较相邻两个元素的大小,如果前一个元素大于后一个元素,则交换它们的位置,重复这个过程直到整个数组排好序。 基本思路 遍历数组,将相邻两个元素进行比较,若前一个元素比后一个大,则交换它们的位置; 每遍历一轮,就可以找到当前最大或最小的元素,需要遍历数组长度减去已排序部分的次数。 代码实现 public st…

    Java 2023年5月19日
    00
  • 详解servlet配置load-on-startup的作用

    下面是详解servlet配置load-on-startup的作用的完整攻略: 什么是load-on-startup 在Java Web中,一个servlet通常在客户端请求它时才会被加载并初始化,但某些时候我们希望它在服务器启动时就被加载和初始化,而不是在客户端请求它时再进行初始化。load-on-startup就是一种配置方式,用来在服务器启动时就加载和初…

    Java 2023年6月15日
    00
  • 深入了解Spring中的FactoryBean

    深入了解Spring中的FactoryBean 在Spring中,有一个FactoryBean接口,它的作用是创建和管理一个对象的实例。与普通的bean定义不同,FactoryBean的bean定义被Spring视为一个创建bean实例的工厂。本文将深入介绍Spring中FactoryBean的使用方法和示例。 FactoryBean接口 Spring的Fa…

    Java 2023年5月19日
    00
  • 用JSP下载word文件(不会直接用IE打开)

    详细讲解“用JSP下载word文件(不会直接用IE打开)”的完整攻略如下: 1. 确定需要下载的文件路径 首先需要确认需要下载的word文件路径,并将其存储到服务器上,以便于后续读取。可以在服务器上建立一个专门用于存储文件的目录,比如 /files/,然后将需要下载的word文件存储在该目录下。 File file = new File(request.ge…

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