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

相关文章

  • 21基于java的旅游信息管理系统

    项目背景 根据旅游行业的这种现状,提出解决问题的一个可行性方法,实现了旅游管理的网络化。 项目总体介绍 旅游系统设计分为前后网站和后台管理系统,功能点包含旅游景点信息分类展示、景点详情(地理位置、特色景点概述等)、下单预订等功能;角色分为管理员和普通用户。用户可以对旅游线路及其详细信息进行查询、预定旅游线路等。详细如下: 用户注册,登录 查看和预订旅游路线 …

    Java 2023年5月5日
    00
  • JAVA内部类示例详解及练习

    下面我就来详细讲解一下“JAVA内部类示例详解及练习”的完整攻略。 什么是Java内部类 Java内部类(Inner Class)指的是定义在另一个类中的类。Java内部类可以分为四种类型:成员内部类、静态内部类、局部内部类、匿名内部类。其中,成员内部类是最常用的一种形式。 成员内部类示例 下面通过一个示例来详解一下成员内部类的定义和使用: public c…

    Java 2023年5月23日
    00
  • idea如何配置javafxsdk详细教程

    下面我将给出详细讲解“IDEA如何配置JavaFX SDK”的完整攻略。 1. 下载JavaFX SDK 首先,我们需要下载JavaFX SDK,并解压到一个方便查找的目录中。可以通过以下链接下载:JavaFX SDK。 2. 配置IDEA 2.1 配置项目 打开IDEA,创建一个新项目,选择JavaFX模板,设置项目名称和保存路径。然后在“Project …

    Java 2023年5月26日
    00
  • Java之网络编程案例讲解

    Java之网络编程案例讲解 网络编程概述 网络编程是指编写程序使计算机之间实现通信的过程。在网络编程中通信是指通过套接字Socket在两台计算机之间进行的。Socket 是应用层与TCP/IP协议族通信的通信端点,也是TCP/IP协议族中最重要定位方式之一。 Java网络编程 Java网络编程中能用来实现网络通信的类实在是太多了,这里我只列举几个常用的。 j…

    Java 2023年5月23日
    00
  • SpringMVC @RequestMapping注解属性详细介绍

    以下是关于“SpringMVC @RequestMapping注解属性详细介绍”的完整攻略,其中包含两个示例。 SpringMVC @RequestMapping注解属性详细介绍 在SpringMVC中,@RequestMapping注解是一个非常重要的注解,它用于将请求映射到对应的控制器方法上。@RequestMapping注解有很多属性,下面我们来详细介…

    Java 2023年5月16日
    00
  • 关于重写equals()方法和hashCode()方法及其简单的应用

    当我们需要比较两个对象的内容是否相同时,就需要用到equals()方法。而在使用equals()方法时,如果我们没有重写该方法,那么默认的实现是比较两个对象的内存地址是否相同。 然而,有时候我们并不想比较内存地址,而是希望比较对象的内容是否相同。这时就需要重写equals()方法了。下面是重写equals()方法的攻略: 为什么需要重写equals()方法 …

    Java 2023年5月26日
    00
  • Win2003服务器安全加固设置--进一步提高服务器安全性

    Win2003服务器安全加固设置–进一步提高服务器安全性 一、基础设置 1.更新安全补丁 定期更新最新的安全补丁,主要包括操作系统、IIS、SQL Server、Exchange等软件,确保系统处于最新的安全状态。 2.修改默认密码 默认密码较易被破解,需要及时修改,建议使用8位以上组合密码,包括大小写字母、数字和符号。 3.关闭不必要服务和端口 关闭不必…

    Java 2023年6月15日
    00
  • Java 实战范例之员工管理系统的实现

    Java 实战范例之员工管理系统的实现攻略 1. 系统需求分析 1.1. 员工信息管理模块 根据需求分析,该员工管理系统需要提供对员工信息的增、删、改、查、排序等操作,并能够将员工信息保存在文件中。 1.2. 打印报表模块 该系统还需要提供打印报表的功能,可以根据不同的条件查询员工信息并打印报表。 2. 系统设计 2.1. 类的设计 需要设计Employee…

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