基于SSM+Shiro+Bootstrap实现用户权限管理系统

下面我将结合示例详细讲解如何使用SSM+Shiro+Bootstrap实现用户权限管理系统的完整攻略。

SSM框架搭建

  1. 准备工具和环境:
  2. JDK 1.8+
  3. Maven
  4. IntelliJ IDEA 或Eclipse
  5. Tomcat
  6. 创建Maven项目,并添加以下依赖:
  7. Spring
  8. SpringMVC
  9. MyBatis
  10. 配置web.xml文件,添加SpringMVC的DispatcherServlet 和ContextLoaderListener 。
  11. 配置Spring配置文件applicationContext.xml,添加Spring和MyBatis的配置。
  12. 编写DAO、Service和Controller等业务层代码。

Shiro实现权限管理

  1. 添加Shiro依赖,并配置shiro.ini或shiro.xml文件,定义角色和权限等信息。
  2. 在Spring配置文件中整合Shiro和Spring,在applicationContext.xml文件中添加以下内容:
<!-- 添加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="/"/>
    <property name="unauthorizedUrl" value="/unauthorized"/>
    <property name="filterChainDefinitions">
        <value>
            /logout = logout
            /** = authc
        </value>
    </property>    
</bean>

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

<!-- Shiro Realm -->
<bean id="myRealm" class="com.example.shiro.MyRealm">
    <property name="credentialsMatcher">
        <bean class="org.apache.shiro.authc.credential.Md5CredentialsMatcher">
            <property name="storedCredentialsHexEncoded" value="false"/>
        </bean>
    </property>
</bean>

<!-- Shiro缓存管理器 -->
<bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
    <property name="cacheManagerConfigFile" value="classpath:ehcache-shiro.xml"/>
</bean>

<!-- 开启Shiro的注解支持 -->
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor"/>
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
    <property name="securityManager" ref="securityManager"/>
</bean>

<bean id="lifecycleBeanPostProcessor" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="targetObject" ref="lifecycleBeanPostProcessorTarget"/>
    <property name="targetMethod" value="afterPropertiesSet"/>
</bean>

<bean id="lifecycleBeanPostProcessorTarget" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
  1. 编写自定义Realm类,继承AuthorizingRealm类,并实现对用户的身份认证和授权功能,如下所示:
public class MyRealm extends AuthorizingRealm {

    // 在此方法中根据用户名从数据库或其他地方获取密码,然后进行密码认证
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        // ...
    }

    // 根据用户的角色和权限信息进行授权
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        // ...
    }
}
  1. 在Controller层对访问URL进行Shiro过滤器的配置,如下所示:
@Controller
public class UserController {

    // 访问此URL需要身份认证和角色为"admin"
    @RequestMapping("/admin")
    @RequiresAuthentication
    @RequiresRoles("admin")
    public String admin(Model model) {
        // ...
    }

    // 访问此URL需要身份认证和拥有"userInfo:view"权限
    @RequestMapping("/userInfo")
    @RequiresAuthentication
    @RequiresPermissions("userInfo:view")
    public String userInfo(Model model) {
        // ...
    }

}

Bootstrap实现用户界面

  1. 下载并引入Bootstrap框架及其依赖库。
  2. 设计页面结构和样式,使用Bootstrap提供的各类组件与样式进行开发。
  3. 将Shiro和后端业务逻辑整合到前端页面中,在需要进行权限控制的操作上加上Shiro的标签,如下列示例代码所示:
<c:if test="${shiro.hasRole('admin')}">
  <!-- 只有管理员才能看到的操作 -->
</c:if>

<a href="/userInfo" class="btn btn-primary" role="button" shiro:hasPermission="userInfo:view">
  用户信息
</a>

在这段示例代码中,<c:if>标签和shiro:hasPermission标签都是Shiro提供的标签,用于控制用户是否可以访问某个页面或进行某个操作。

示例1:添加用户

下面以添加用户为例,演示基于SSM+Shiro+Bootstrap实现用户权限管理系统时所需要的具体步骤。

后端代码实现

  1. 编写UserController类的userAdd方法,该方法用于在系统中添加新用户:
@Controller
@RequestMapping(value="/user")
public class UserController {

    // 用户管理器
    @Autowired
    private UserManager userManager;

    // 进入添加用户页面
    @RequestMapping(value="/userAdd", method=RequestMethod.GET)
    public String userAdd(Model model) {
        return "user/userAdd"; // 返回视图名称
    }

    // 执行添加用户操作
    @RequestMapping(value="/userAdd", method=RequestMethod.POST)
    public String doUserAdd(
        @RequestParam("username") String username, 
        @RequestParam("password") String password, 
        @RequestParam("email") String email, 
        @RequestParam("role") String role
    ) {
        User user = new User();
        user.setUsername(username);
        user.setPassword(password);
        user.setEmail(email);
        user.setRole(role);
        userManager.add(user);
        return "redirect:/user/userList"; // 重定向到用户列表页面
    }
}

在上述代码中,我们通过@RequestParam注解获得前端传来的表单提交数据,然后使用UserManager对象的add方法将新用户信息添加到数据库中。

  1. 编写UserManager类的add方法,该方法用于将用户信息插入到数据库中:
@Service("userManager")
public class UserManagerImpl implements UserManager {

    @Autowired
    private UserDao userDao;

    @Transactional
    public void add(User user) {
        String salt = UUID.randomUUID().toString().replace("-", "");
        String hashedPassword = new Md5Hash(user.getPassword(), salt).toString();
        user.setSalt(salt);
        user.setPassword(hashedPassword);
        userDao.insert(user);
    }
}

在上述代码中,我们使用USerDao对象的insert方法将用户信息插入到数据库中,并使用用户密码和一个随机的盐值生成密码的散列值。

前端页面实现

  1. 编写添加用户表单userAdd.jsp,包含输入用户名、密码、邮箱和角色等信息的表单,并使用Bootstrap框架提供的样式进行美化。该表单的代码如下所示:
<form action="${pageContext.request.contextPath}/user/userAdd" method="post">
  <div class="form-group">
    <label for="username">用户名:</label>
    <input type="text" class="form-control" name="username" id="username" placeholder="请输入用户名" required>
  </div>
  <div class="form-group">
    <label for="password">密码:</label>
    <input type="password" class="form-control" name="password" id="password" placeholder="请输入密码" required>
  </div>
  <div class="form-group">
    <label for="email">邮箱:</label>
    <input type="email" class="form-control" name="email" id="email" placeholder="请输入邮箱" required>
  </div>
  <div class="form-group">
    <label for="role">角色:</label>
    <select class="form-control" name="role" id="role">
      <option value="user">普通用户</option>
      <option value="admin">管理员</option>
    </select>
  </div>
  <div style="text-align:center;">
      <button type="submit" class="btn btn-primary">添加</button>
  </div>
</form>

在上述代码中,我们使用了Bootstrap提供的表单组件,分别对应用户名、密码、邮箱和角色等表单项。

  1. 编写UserController类中的userAdd方法,该方法用于显示用户添加表单页面:
@Controller
@RequestMapping(value="/user")
public class UserController {

    // 进入添加用户页面
    @RequestMapping(value="/userAdd", method=RequestMethod.GET)
    @RequiresRoles("admin") // 需要管理员角色才能访问
    public String userAdd(Model model) {
        return "user/userAdd";
    }
}

在上述代码中,我们使用了Shiro提供的@RequiresRoles("admin")注解,表示只有拥有管理员角色的用户才能访问该页面。

示例2:用户列表

下面以用户列表为例,演示基于SSM+Shiro+Bootstrap实现用户权限管理系统时所需要的具体步骤。

后端代码实现

  1. 编写UserController类的userList方法,该方法用于查询所有已注册的用户信息:
@Controller
@RequestMapping(value="/user")
public class UserController {

    // 用户管理器
    @Autowired
    private UserManager userManager;

    // 查询用户列表
    @RequestMapping(value="/userList", method=RequestMethod.GET)
    @RequiresPermissions("userInfo:view") // 需要userInfo:view权限才能访问
    public String userList(Model model) {
        List<User> users = userManager.findAll();
        model.addAttribute("users", users);
        return "user/userList";
    }
}

在上述代码中,我们使用了UserManager对象的findAll方法查询了所有注册的用户信息,并将查询结果存储到了Model中,然后返回了user/userList视图名称。

  1. 编写UserManager类的findAll方法,该方法用于查询所有已注册的用户信息:
@Service("userManager")
public class UserManagerImpl implements UserManager {

    @Autowired
    private UserDao userDao;

    @Override
    public List<User> findAll() {
        return userDao.selectAll();
    }
}

在上述代码中,我们使用USerDao对象的selectAll方法查询了数据库中的所有用户信息,并返回了一个包含所有用户信息的列表。

前端页面实现

  1. 编写用户列表页面userList.jsp,该页面用于显示用户信息列表,并使用Bootstrap提供的样式进行美化。该页面的代码如下所示:
<table class="table table-striped table-hover">
  <thead>
    <tr>
      <th>用户名</th>
      <th>邮箱</th>
      <th>角色</th>
      <th>操作</th>
    </tr>
  </thead>
  <tbody>
    <c:forEach var="user" items="${users}">
      <tr>
        <td>${user.username}</td>
        <td>${user.email}</td>
        <td>${user.role}</td>
        <td>
          <div class="btn-group">
            <a href="${pageContext.request.contextPath}/user/userEdit/${user.id}" class="btn btn-sm btn-primary" role="button" shiro:hasPermission="userInfo:edit">编辑</a>
            <a href="${pageContext.request.contextPath}/user/userDelete/${user.id}" class="btn btn-sm btn-danger" role="button" shiro:hasPermission="userInfo:delete">删除</a>
          </div>
        </td>
      </tr>
    </c:forEach>
  </tbody>
</table>

在上述代码中,我们使用Bootstrap提供的表格组件实现了用户信息列表,并使用了Shiro提供的shiro:hasPermission标签实现对用户操作权限的控制。

  1. 编写UserController类中的userList方法,该方法用于显示用户列表页面:
@Controller
@RequestMapping(value="/user")
public class UserController {

    // 查询用户列表
    @RequestMapping(value="/userList", method=RequestMethod.GET)
    @RequiresPermissions("userInfo:view") // 需要userInfo:view权限才能访问
    public String userList(Model model) {
        List<User> users = userManager.findAll();
        model.addAttribute("users", users);
        return "user/userList";
    }
}

在上述代码中,我们同样使用了Shiro提供的@RequiresPermissions注解,表示只有拥有view用户信息的权限的用户才能访问该页面。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于SSM+Shiro+Bootstrap实现用户权限管理系统 - Python技术站

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • jsp页面中表达式语言中的$符号不起作用的解决方法

    在JSP页面中,使用表达式语言(EL)可以方便地访问JavaBean中的属性和方法,并将它们展示在页面上。表达式语言的默认前缀是${},其中${expression}是要计算的表达式。但是有时候在EL中使用了$符号时可能出现不起作用的情况,接下来我将为您提供解决这个问题的完整攻略。 1. $符号会被JSP容器解析为结束一个JSP表达式的符号,所以需要转义 例…

    Java 2023年6月15日
    00
  • Java日常练习题,每天进步一点点(20)

    Java日常练习题,每天进步一点点(20)攻略 简介 这是一份Java日常练习题,每天练习一点点,逐步提高自己的编程能力。本文将对练习题进行一一讲解,帮助读者更好地理解题目并解决问题。 环境要求 Java编程环境(JDK) 编程工具 题目详解 1. 题目描述 编写程序,输入一个字符串,统计其中数字字符出现的次数。 示例1 请输入字符串:Hello123Wor…

    Java 2023年5月23日
    00
  • jquery.pager.js实现分页效果

    实现分页效果是网站和应用中常见的功能,jQuery是一种广泛使用的JavaScript库,可以方便地实现分页效果。本文将介绍使用jQuery的一个分页插件jquery.pager.js来实现分页效果的完整攻略,包括具体的步骤和代码示例。 1. 引入jQuery和jquery.pager.js文件 在使用jquery.pager.js插件前需要引入jQuery…

    Java 2023年6月15日
    00
  • Spring集成Mybatis过程详细讲解

    下面就为您详细讲解“Spring集成Mybatis过程详细讲解”的完整攻略。 1. 前置条件 在开始Spring集成Mybatis之前,您需要先安装好以下开发环境: JDK(Java Development Kit):1.8及以上版本 Maven:3.0及以上版本 Spring:5.0及以上版本 Mybatis:3.4及以上版本 2. 创建Maven工程 首…

    Java 2023年5月20日
    00
  • 原来Spring能注入集合和Map的computeIfAbsent是这么好用!

    大家好,我是3y,今天继续来聊我的开源项目austin啊,但实际内容更新不多。这文章主是想吹下水,主要聊聊我在更新项目中学到的小技巧。 今天所说的小技巧可能有很多人都会,但肯定也会有跟我一样之前没用过的。 消息推送平台?推送下发【邮件】【短信】【微信服务号】【微信小程序】【企业微信】【钉钉】等消息类型。 https://gitee.com/zhongfuch…

    Java 2023年5月8日
    00
  • tomcat服务器安全设置方法

    Tomcat服务器安全设置方法 Tomcat是一种常见的Web服务器,但如果不进行适当的安全设置,可能会有一些安全风险,例如被黑客攻击的风险,导致敏感信息泄露等问题。本文将介绍几种Tomcat服务器的安全设置方法,以提高Tomcat服务器的安全性。 使用HTTPS协议保护敏感信息 使用HTTPS协议可以对敏感信息进行加密,以防止信息被窃听或篡改。以下是如何配…

    Java 2023年5月19日
    00
  • Spring mvc实现Restful返回json格式数据实例详解

    下面是关于“Spring MVC实现Restful返回JSON格式数据实例详解”的完整攻略,包含两个示例说明。 Spring MVC实现Restful返回JSON格式数据 在本文中,我们将介绍如何使用Spring MVC实现Restful返回JSON格式数据。 步骤1:添加依赖 首先,我们需要在pom.xml中添加Spring MVC和Jackson的依赖。…

    Java 2023年5月17日
    00
  • Java 方法递归的思路详解

    针对“Java 方法递归的思路详解”,我将针对以下几个方面进行详细讲解: 什么是方法递归? 方法递归的基本思路 方法递归的优缺点 方法递归的应用场景 工程中递归的运用示例 什么是方法递归? 方法递归是指在一个方法内部调用自身的行为,也就是说,一个方法通过调用自己来完成某种功能或者解决某个问题。 方法递归的基本思路 方法递归的基本思路可以概括为以下几个步骤: …

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