基于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日

相关文章

  • asp中静态页面实现方法

    下面我将为您详细讲解ASP中静态页面实现方法的完整攻略。 什么是ASP? ASP是一种动态网页技术,它使用VBScript或JScript语言在服务器端动态生成HTML页面,从而实现动态网站的功能。 ASP中实现静态页面方法 在ASP中,我们可以使用两种方法来实现静态页面: 1. 使用Response对象 我们可以使用Response对象将页面内容输出到客户…

    Java 2023年6月16日
    00
  • JavaSpringBoot报错“ClientErrorException”的原因和处理方法

    原因 “ClientErrorException” 错误通常是以下原因引起的: 客户端请求问题:如果客户端请求存在问题,则可能会出现此错误。在这种情况下,需要检查客户端请求并确保它们正确。 服务器响应问题:如果服务器响应存在问题,则可能会出现此错误。在这种情况下,需要检查服务器响应并确保它们正确。 网络连接问题:如果网络连接存在问题,则可能会出现此错误。在这…

    Java 2023年5月4日
    00
  • chatgpt java环境调用源码实现demo

    下面是详细讲解chatgpt java环境调用源码实现demo的完整攻略: 简介 ChatGPT是一个基于开源机器学习模型GPT和transformer的Python库,可用于生成和解决各种自然语言处理问题。在Java环境中调用ChatGPT Python库将为开发人员提供API服务的能力。本文将提供一个实际的demo,介绍如何在Java应用程序中使用Cha…

    Java 2023年5月26日
    00
  • nodejs和php实现图片访问实时处理

    下面给出一份基于nodejs和php实现图片访问实时处理的攻略。 1. 背景 随着互联网技术的快速发展,对于图片的访问和处理需求也越来越多。使用nodejs和php的组合可以满足这种需求,可以实时处理图片访问,提高网站的访问速度和用户体验。 2. 实现过程 下面详细阐述nodejs和php实现图片访问实时处理的完整攻略。 2.1 安装Node.js和PHP …

    Java 2023年6月15日
    00
  • Java实现扫雷游戏详细代码讲解

    Java实现扫雷游戏详细代码讲解 前言 扫雷是经典的小游戏之一,本文将详细讲解如何使用Java实现扫雷游戏,并提供完整的代码示例。 实现思路 界面设计:使用Swing开发GUI界面,布置扫雷棋盘、计时和雷数量显示。 地图生成:随机生成地图,并根据雷的数量给出提示。 扫雷逻辑:根据用户点击的位置判断是否为雷,显示相应的数字或“game over”等提示信息。 …

    Java 2023年5月23日
    00
  • java结合HADOOP集群文件上传下载

    Java结合Hadoop集群文件上传下载的攻略如下: 1. 确认Hadoop集群状态 在开始上传或下载文件之前,为了确保集群状态正常,需要使用以下命令检查Hadoop集群是否处于正常状态: hadoop fs -ls / 如果出现Hadoop根目录的内容列表,则表示集群状态正常。 2. 文件上传 方式一:利用Hadoop API上传文件 Java代码示例如下…

    Java 2023年5月31日
    00
  • 值得收藏的9个提高代码运行效率的小技巧(推荐)

    值得收藏的9个提高代码运行效率的小技巧(推荐) 在代码编写时,优化程序的效率是非常重要的。本文提供了9个小技巧,可以帮助你提高代码的运行效率。 1. 使用map而不是for循环 使用 map() 命令可以在 Python 中更快地编写相同的代码。 它对列表中的每个元素执行相同的操作,并返回结果的列表。下面是一个示例: # 使用 for 循环 data = […

    Java 2023年5月23日
    00
  • 面试题快慢链表和快慢指针

    快慢链表和快慢指针是算法中常见的一种技巧。它们在链表中查找中间节点、判断链表是否有环等情况下十分实用。下面就对快慢链表和快慢指针的使用进行详细讲解。 快慢指针 快慢指针的基本思想是将两个指针指向链表的头节点,快指针每次走两步,慢指针每次走一步,当快指针走到链表的末尾时,慢指针指向的就是链表的中间节点。 示例 1: 找到链表的中间节点 我们有一个链表,包含以下…

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