下面我将结合示例详细讲解如何使用SSM+Shiro+Bootstrap实现用户权限管理系统的完整攻略。
SSM框架搭建
- 准备工具和环境:
- JDK 1.8+
- Maven
- IntelliJ IDEA 或Eclipse
- Tomcat
- 创建Maven项目,并添加以下依赖:
- Spring
- SpringMVC
- MyBatis
- 配置
web.xml
文件,添加SpringMVC的DispatcherServlet 和ContextLoaderListener 。 - 配置Spring配置文件
applicationContext.xml
,添加Spring和MyBatis的配置。 - 编写DAO、Service和Controller等业务层代码。
Shiro实现权限管理
- 添加Shiro依赖,并配置shiro.ini或shiro.xml文件,定义角色和权限等信息。
- 在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"/>
- 编写自定义Realm类,继承
AuthorizingRealm
类,并实现对用户的身份认证和授权功能,如下所示:
public class MyRealm extends AuthorizingRealm {
// 在此方法中根据用户名从数据库或其他地方获取密码,然后进行密码认证
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
// ...
}
// 根据用户的角色和权限信息进行授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
// ...
}
}
- 在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实现用户界面
- 下载并引入Bootstrap框架及其依赖库。
- 设计页面结构和样式,使用Bootstrap提供的各类组件与样式进行开发。
- 将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实现用户权限管理系统时所需要的具体步骤。
后端代码实现
- 编写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方法将新用户信息添加到数据库中。
- 编写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方法将用户信息插入到数据库中,并使用用户密码和一个随机的盐值生成密码的散列值。
前端页面实现
- 编写添加用户表单
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提供的表单组件,分别对应用户名、密码、邮箱和角色等表单项。
- 编写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实现用户权限管理系统时所需要的具体步骤。
后端代码实现
- 编写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
视图名称。
- 编写UserManager类的findAll方法,该方法用于查询所有已注册的用户信息:
@Service("userManager")
public class UserManagerImpl implements UserManager {
@Autowired
private UserDao userDao;
@Override
public List<User> findAll() {
return userDao.selectAll();
}
}
在上述代码中,我们使用USerDao对象的selectAll方法查询了数据库中的所有用户信息,并返回了一个包含所有用户信息的列表。
前端页面实现
- 编写用户列表页面
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
标签实现对用户操作权限的控制。
- 编写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技术站