• java学习day53-54(SSM)SSM权限操作


    1. 数据库与表结构
    1.1 用户表
    1.1.1 用户表信息描述 users

    1.1.2 sql语句

    1. CREATE TABLE users(
    2. id varchar2(32) default SYS_GUID() PRIMARY KEY,
    3. email VARCHAR2(50) UNIQUE NOT NULL,
    4. username VARCHAR2(50),
    5. PASSWORD VARCHAR2(50),
    6. phoneNum VARCHAR2(20),
    7. STATUS INT
    8. )

     1.1.3 实体类

    1. public class UserInfo {
    2. private String id;
    3. private String username;
    4. private String email;
    5. private String password;
    6. private String phoneNum;
    7. private int status;
    8. private String statusStr;
    9. private List roles;
    10. }
    1.2 角色表
    1.2.1 角色表信息描述 role

    1.2.2 sql语句

    1. CREATE TABLE role(
    2. id varchar2(32) default SYS_GUID() PRIMARY KEY,
    3. roleName VARCHAR2(50) ,
    4. roleDesc VARCHAR2(50)
    5. )

     1.2.3 实体类

    1. public class Role {
    2. private String id;
    3. private String roleName;
    4. private String roleDesc;
    5. private List permissions;
    6. private List users;
    7. }
    1.2.4 用户与角色关联关系
    用户与角色之间是多对多关系,我们通过 user_role 表来描述其关联,在实体类中 User 中存在 List ,在 Role 中有 List.
    而角色与权限之间也存在关系,我们会在后面介绍。
    1. CREATE TABLE users_role(
    2. userId varchar2(32),
    3. roleId varchar2(32),
    4. PRIMARY KEY(userId,roleId),
    5. FOREIGN KEY (userId) REFERENCES users(id),
    6. FOREIGN KEY (roleId) REFERENCES role(id)
    7. )
    1.3 资源权限表
    1.3.1 权限资源表描述 permission

    1.3.2 sql语句

    1. CREATE TABLE permission(
    2. id varchar2(32) default SYS_GUID() PRIMARY KEY,
    3. permissionName VARCHAR2(50) ,
    4. url VARCHAR2(50)
    5. )

     1.3.3 实体类

    1. public class Permission {
    2. private String id;
    3. private String permissionName;
    4. private String url;
    5. private List roles;
    6. }
    1.3.4. 权限资源与角色关联关系
    权限资源与角色是多对多关系,我们使用 role_permission 表来描述。在实体类 Permission 中存在 List, Role 类中有List
    1. CREATE TABLE role_permission(
    2. permissionId varchar2(32),
    3. roleId varchar2(32),
    4. PRIMARY KEY(permissionId,roleId),
    5. FOREIGN KEY (permissionId) REFERENCES permission(id),
    6. FOREIGN KEY (roleId) REFERENCES role(id)
    7. )
    2.Spring Security 概述
    2.1 Spring Security 介绍
    Spring Security 的前身是 Acegi Security ,是 Spring 项目组中用来提供安全认证服务的框架。
    ( https://projects.spring.io/spring-security/ ) Spring Security 为基于 J2EE 企业应用软件提供了全面安全服务。特别是使用领先的J2EE 解决方案 -Spring 框架开发的企业软件项目。人们使用 Spring Security 有很多种原因,不过通常吸引他们的是在J2EE Servlet 规范或 EJB 规范中找不到典型企业应用场景的解决方案。 特别要指出的是他们不能再WAR 或 EAR 级别进行移植。这样,如果你更换服务器环境,就要,在新的目标环境进行大量的工作,对你的应用系统进行重新配 置安全。使用Spring Security 解决了这些问题,也为你提供很多有用的,完全可以指定的其他安全特性。 安全包括两个主要操作。
    认证 ,是为用户建立一个他所声明的主体。主题一般式指用户,设备或可以在你系 统中执行动作的其他系统。
    授权 指的是一个用户能否在你的应用中执行某个操作,在到达授权判断之前,身份的主题已经由 身份验证过程建立了。
    这些概念是通用的,不是 Spring Security 特有的。在身份验证层面, Spring Security 广泛支持各种身份验证模式,这些验证模型绝大多数都由第三方提供,或则正在开发的有关标准机构提供的,例如 Internet Engineering Task Force.作为补充, Spring Security 也提供了自己的一套验证功能。
    Spring Security 目前支持认证一体化如下认证技术: HTTP BASIC authentication headers ( 一个基于 IEFT RFC 的标准) HTTP Digest authentication headers ( 一个基于 IEFT RFC 的标准 ) HTTP X.509 client certifificate exchange(一个基于 IEFT RFC 的标准 ) LDAP ( 一个非常常见的跨平台认证需要做法,特别是在大环境 ) Form-based authentication (提供简单用户接口的需求 ) OpenID authentication Computer Associates Siteminder JA-SIG Central Authentication Service (CAS,这是一个流行的开源单点登录系统 ) Transparent authentication context propagation for Remote Method Invocation and HttpInvoker (一个 Spring 远程调用协议 )
    Maven 依赖
    1. <dependencies>
    2. <dependency>
    3. <groupId>org.springframework.securitygroupId>
    4. <artifactId>spring-security-webartifactId>
    5. <version>5.0.1.RELEASEversion>
    6. dependency>
    7. <dependency>
    8. <groupId>org.springframework.securitygroupId>
    9. <artifactId>spring-security-configartifactId>
    10. <version>5.0.1.RELEASEversion>
    11. dependency>
    12. dependencies>
    2.2 Spring Security 快速入门
    2.2.1 pom.xml
    1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-
    2. instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-
    4. 4.0.0.xsd">
    5. <modelVersion>4.0.0modelVersion>
    6. <groupId>spring_security_demogroupId>
    7. <artifactId>SpringSecurity_quickStartartifactId>
    8. <version>0.0.1-SNAPSHOTversion>
    9. <packaging>warpackaging>
    10. <properties>
    11. <spring.version>5.0.2.RELEASEspring.version>
    12. <spring.security.version>5.0.1.RELEASEspring.security.version>
    13. properties>
    14. <dependencies>
    15. <dependency>
    16. <groupId>org.springframeworkgroupId>
    17. <artifactId>spring-coreartifactId>
    18. <version>${spring.version}version>
    19. dependency>
    20. <dependency>
    21. <groupId>org.springframeworkgroupId>
    22. <artifactId>spring-webartifactId>
    23. <version>${spring.version}version>
    24. dependency>
    25. <dependency>
    26. <groupId>org.springframeworkgroupId>
    27. <artifactId>spring-webmvcartifactId>
    28. <version>${spring.version}version>
    29. dependency>
    30. <dependency>
    31. <groupId>org.springframeworkgroupId>
    32. <artifactId>spring-context-supportartifactId>
    33. <version>${spring.version}version>
    34. dependency>
    35. <dependency>
    36. <groupId>org.springframeworkgroupId>
    37. <artifactId>spring-testartifactId>
    38. <version>${spring.version}version>
    39. dependency>
    40. <dependency>
    41. <groupId>org.springframeworkgroupId>
    42. <artifactId>spring-jdbcartifactId>
    43. <version>${spring.version}version>
    44. dependency>
    45. <dependency>
    46. <groupId>org.springframework.securitygroupId>
    47. <artifactId>spring-security-webartifactId>
    48. <version>${spring.security.version}version>
    49. dependency>
    50. <dependency>
    51. <groupId>org.springframework.securitygroupId>
    52. <artifactId>spring-security-configartifactId>
    53. <version>${spring.security.version}version>
    54. dependency>
    55. <dependency>
    56. <groupId>javax.servletgroupId>
    57. <artifactId>javax.servlet-apiartifactId>
    58. <version>3.1.0version>
    59. <scope>providedscope>
    60. dependency>
    61. dependencies>
    62. <build>
    63. <plugins>
    64. <plugin>
    65. <groupId>org.apache.maven.pluginsgroupId>
    66. <artifactId>maven-compiler-pluginartifactId>
    67. <version>3.2version>
    68. <configuration>
    69. <source>1.8source>
    70. <target>1.8target>
    71. <encoding>UTF-8encoding>
    72. configuration>
    73. plugin>
    74. <plugin>
    75. <groupId>org.apache.tomcat.mavengroupId>
    76. <artifactId>tomcat7-maven-pluginartifactId>
    77. <configuration>
    78. <port>8080port>
    79. <path>/path>
    80. configuration>
    81. plugin>
    82. plugins>
    83. build>
    84. project>
    2.2.2 web.xml
    1. <context-param>
    2. <param-name>contextConfigLocationparam-name>
    3. <param-value>classpath:spring-security.xmlparam-value>
    4. context-param>
    5. <listener>
    6. <listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
    7. listener>
    8. <filter>
    9. <filter-name>springSecurityFilterChainfilter-name>
    10. <filter-class>org.springframework.web.filter.DelegatingFilterProxyfilter-class>
    11. filter>
    12. <filter-mapping>
    13. <filter-name>springSecurityFilterChainfilter-name>
    14. <url-pattern>/*url-pattern>
    15. filter-mapping>
    2.2.3 spring security 配置
    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:security="http://www.springframework.org/schema/security"
    4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    5. xsi:schemaLocation="http://www.springframework.org/schema/beans
    6. http://www.springframework.org/schema/beans/spring-beans.xsd
    7. http://www.springframework.org/schema/security
    8. http://www.springframework.org/schema/security/spring-security.xsd">
    9. <security:http auto-config="true" use-expressions="false">
    10. <security:intercept-url pattern="/**" access="ROLE_USER" />
    11. security:http>
    12. <security:authentication-manager>
    13. <security:authentication-provider>
    14. <security:user-service>
    15. <security:user name="user" password="{noop}user"
    16. authorities="ROLE_USER" />
    17. <security:user name="admin" password="{noop}admin"
    18. authorities="ROLE_ADMIN" />
    19. security:user-service>
    20. security:authentication-provider>
    21. security:authentication-manager>
    22. beans>
    2.2.4 测试
    我们在 webapp 下创建一个 index.html 页面,在页面中任意写些内容。
    当我们访问 index.html 页面时发现会弹出登录窗口,可能你会奇怪,我们没有建立下面的登录页面,为什么 Spring Security会跳到上面的登录页面呢?这是我们设置 http auto-confifig=”true” Spring Security 自动为我们生成的。
    2.2.5 使用自定义页面
    2.2.5.1 spring-security.xml 配置
    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:security="http://www.springframework.org/schema/security"
    4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    5. xsi:schemaLocation="http://www.springframework.org/schema/beans
    6. http://www.springframework.org/schema/beans/spring-beans.xsd
    7. http://www.springframework.org/schema/security
    8. http://www.springframework.org/schema/security/spring-security.xsd">
    9. <security:http security="none" pattern="/login.html" />
    10. <security:http security="none" pattern="/failer.html" />
    11. <security:http auto-config="true" use-expressions="false">
    12. <security:intercept-url pattern="/**" access="ROLE_USER" />
    13. <security:form-login login-page="/login.html"
    14. login-processing-url="/login" username-parameter="username"
    15. password-parameter="password" authentication-failure-url="/failer.html"
    16. default-target-url="/success.html"
    17. />
    18. <security:logout invalidate-session="true" logout-url="/logout"
    19. logout-success-url="/login.jsp" />
    20. <security:csrf disabled="true" />
    21. security:http>
    22. <security:authentication-manager>
    23. <security:authentication-provider>
    24. <security:user-service>
    25. <security:user name="user" password="{noop}user"
    26. authorities="ROLE_USER" />
    27. <security:user name="admin" password="{noop}admin"
    28. authorities="ROLE_ADMIN" />
    29. security:user-service>
    30. security:authentication-provider>
    31. security:authentication-manager>
    32. beans>
    2.2.5.2 login.html
    1. html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Insert title heretitle>
    6. head>
    7. <body>
    8. <form action="login" method="post">
    9. <table>
    10. <tr>
    11. <td>用户名:td>
    12. <td><input type="text" name="username" />td>
    13. tr>
    14. <tr>
    15. <td>密码:td>
    16. <td><input type="password" name="password" />td>
    17. tr>
    18. <tr>
    19. <td colspan="2" align="center"><input type="submit" value="登录" />
    20. <input type="reset" value="重置" />td>
    21. tr>
    22. table>
    23. form>
    24. body>
    25. html>
    2.2.5.3 success.html
    1. html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Insert title heretitle>
    6. head>
    7. <body>
    8. success html<br>
    9. <a href="logout">退出a>
    10. body>
    11. html>
    2.2.5.4 failer.html
    1. html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Insert title heretitle>
    6. head>
    7. <body>登录失败
    8. body>
    9. html>
    2.3 Spring Security 使用数据库认证
    Spring Security 中如果想要使用数据进行认证操作,有很多种操作方式,这里我们介绍使用 UserDetails 、 UserDetailsService来完成操作。
    UserDetails
    1. public interface UserDetails extends Serializable {
    2. Collectionextends GrantedAuthority> getAuthorities();
    3. String getPassword();
    4. String getUsername();
    5. boolean isAccountNonExpired();
    6. boolean isAccountNonLocked();
    7. boolean isCredentialsNonExpired();
    8. boolean isEnabled();
    9. }
    UserDetails 是一个接口,我们可以认为 UserDetails 作用是于封装当前进行认证的用户信息,但由于其是一个接口,所以我们可以对其进行实现,也可以使用Spring Security 提供的一个 UserDetails 的实现类 User 来完成操作
    以下是 User 类的部分代码
    1. public class User implements UserDetails, CredentialsContainer {
    2. private String password;
    3. private final String username;
    4. private final Set authorities;
    5. private final boolean accountNonExpired; //帐户是否过期
    6. private final boolean accountNonLocked; //帐户是否锁定
    7. private final boolean credentialsNonExpired; //认证是否过期
    8. private final boolean enabled; //帐户是否可用
    UserDetailsService
    1. public interface UserDetailsService {
    2. UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
    3. }
    上面将 UserDetails UserDetailsService 做了一个简单的介绍,那么我们具体如何完成 Spring Security 的数据库认证操作哪,我们通过用户管理中用户登录来完成Spring Security 的认证操作。
    3. 用户管理
    3.1 用户登录
    spring security 的配置
    1. <security:authentication-manager>
    2. <security:authentication-provider user-service-ref="userService">
    3. security:authentication-provider>
    4. security:authentication-manager>
    3.1.1. 登录页面 login.jsp
    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    4. <html>
    5. <head>
    6. <meta charset="utf-8">
    7. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    8. <title>数据 - AdminLTE2定制版 | Log intitle>
    9. <meta
    10. content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"
    11. name="viewport">
    12. <link rel="stylesheet"
    13. href="${pageContext.request.contextPath}/plugins/bootstrap/css/bootstrap.min.css">
    14. <link rel="stylesheet"
    15. href="${pageContext.request.contextPath}/plugins/font-awesome/css/font-awesome.min.css">
    16. <link rel="stylesheet"
    17. href="${pageContext.request.contextPath}/plugins/ionicons/css/ionicons.min.css">
    18. <link rel="stylesheet"
    19. href="${pageContext.request.contextPath}/plugins/adminLTE/css/AdminLTE.css">
    20. <link rel="stylesheet"
    21. href="${pageContext.request.contextPath}/plugins/iCheck/square/blue.css">
    22. head>
    23. <body class="hold-transition login-page">
    24. <div class="login-box">
    25. <div class="login-logo">
    26. <a href="all-admin-index.html"><b>ITCASTb>后台管理系统a>
    27. div>
    28. <div class="login-box-body">
    29. <p class="login-box-msg">登录系统p>
    30. <form action="${pageContext.request.contextPath}/login.do" method="post">
    31. <div class="form-group has-feedback">
    32. <input type="text" name="username" class="form-control"
    33. placeholder="用户名"> <span
    34. class="glyphicon glyphicon-envelope form-control-feedback">span>
    35. div>
    36. <div class="form-group has-feedback">
    37. <input type="password" name="password" class="form-control"
    38. placeholder="密码"> <span
    39. class="glyphicon glyphicon-lock form-control-feedback">span>
    40. div>
    41. <div class="row">
    42. <div class="col-xs-8">
    43. <div class="checkbox icheck">
    44. <label><input type="checkbox"> 记住 下次自动登录label>
    45. div>
    46. div>
    47. <div class="col-xs-4">
    48. <button type="submit" class="btn btn-primary btn-block btn-flat">登录button>
    49. div>
    50. div>
    51. form>
    52. <a href="#">忘记密码a><br>
    53. div>
    54. div>
    55. <script
    56. src="${pageContext.request.contextPath}/plugins/jQuery/jquery-2.2.3.min.js">script>
    57. <script
    58. src="${pageContext.request.contextPath}/plugins/bootstrap/js/bootstrap.min.js">script>
    59. <script
    60. src="${pageContext.request.contextPath}/plugins/iCheck/icheck.min.js">script>
    61. <script>
    62. $(function() {
    63. $('input').iCheck({
    64. checkboxClass : 'icheckbox_square-blue',
    65. radioClass : 'iradio_square-blue',
    66. increaseArea : '20%' // optional
    67. });
    68. });
    69. script>
    70. body>
    71. html>
    3.1.2.Service
    1. public interface IUserService extends UserDetailsService{
    2. }
    1. @Service("userService")
    2. @Transactional
    3. public class UserServiceImpl implements IUserService {
    4. @Autowired
    5. private IUserDao userDao;
    6. @Override
    7. public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    8. UserInfo userInfo = userDao.findByUsername(username);
    9. List roles = userInfo.getRoles();
    10. List authoritys = getAuthority(roles);
    11. User user = new User(userInfo.getUsername(), "{noop}" + userInfo.getPassword(),
    12. userInfo.getStatus() == 0 ? false : true, true, true, true, authoritys);
    13. return user;
    14. }
    15. private List getAuthority(List roles) {
    16. List authoritys = new ArrayList();
    17. for (Role role : roles) {
    18. authoritys.add(new SimpleGrantedAuthority(role.getRoleName()));
    19. }
    20. return authoritys;
    21. }
    22. }
    3.1.3.IUserDao
    1. public interface IUserDao {
    2. @Select("select * from user where id=#{id}")
    3. public UserInfo findById(Long id) throws Exception;
    4. @Select("select * from user where username=#{username}")
    5. @Results({
    6. @Result(id = true, property = "id", column = "id"),
    7. @Result(column = "username", property = "username"),
    8. @Result(column = "email", property = "email"),
    9. @Result(column = "password", property = "password"),
    10. @Result(column = "phoneNum", property = "phoneNum"),
    11. @Result(column = "status", property = "status"),
    12. @Result(column = "id", property = "roles", javaType = List.class, many =
    13. @Many(select = "com.itheima.ssm.dao.IRoleDao.findRoleByUserId")) })
    14. public UserInfo findByUsername(String username);
    15. }
    3.2 用户退出
    使用 spring security 完成用户退出,非常简单
    配置
    <security:logout invalidate-session="true" logout-url="/logout.do" logout-successurl="/login.jsp" />
    页面中
    1. <a href="${pageContext.request.contextPath}/logout.do"
    2. class="btn btn-default btn-flat">注销a>
    3.3 用户查询
    3.3.1. 用户查询页面 user-list.jsp
    请在资料中查看具体代码
    3.3.2.UserController
    1. @Controller
    2. @RequestMapping("/user")
    3. public class UserControlller {
    4. @RequestMapping("/findAll.do")
    5. public ModelAndView findAll() throws Exception {
    6. List users = userService.findAll();
    7. ModelAndView mv = new ModelAndView();
    8. mv.addObject("userlist", users);
    9. mv.setViewName("user-list");
    10. return mv;
    11. }
    12. }
    3.3.3.Dao
    1. @Select("select * from user")
    2. public List findAll();
    3.4 用户添加
    3.4.1. 用户添加页面 user-add.jsp
    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    4. <html>
    5. <head>
    6. <meta charset="utf-8">
    7. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    8. <title>数据 - AdminLTE2定制版title>
    9. <meta name="description" content="AdminLTE2定制版">
    10. <meta name="keywords" content="AdminLTE2定制版">
    11. <meta
    12. content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"
    13. name="viewport">
    14. <link rel="stylesheet"
    15. href="${pageContext.request.contextPath}/plugins/bootstrap/css/bootstrap.min.css">
    16. <link rel="stylesheet"
    17. href="${pageContext.request.contextPath}/plugins/font-awesome/css/font-awesome.min.css">
    18. <link rel="stylesheet"
    19. href="${pageContext.request.contextPath}/plugins/ionicons/css/ionicons.min.css">
    20. <link rel="stylesheet"
    21. href="${pageContext.request.contextPath}/plugins/iCheck/square/blue.css">
    22. <link rel="stylesheet"
    23. href="${pageContext.request.contextPath}/plugins/morris/morris.css">
    24. <link rel="stylesheet"
    25. href="${pageContext.request.contextPath}/plugins/jvectormap/jquery-jvectormap-1.2.2.css">
    26. <link rel="stylesheet"
    27. href="${pageContext.request.contextPath}/plugins/datepicker/datepicker3.css">
    28. <link rel="stylesheet"
    29. href="${pageContext.request.contextPath}/plugins/daterangepicker/daterangepicker.css">
    30. <link rel="stylesheet"
    31. href="${pageContext.request.contextPath}/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.min.css">
    32. <link rel="stylesheet"
    33. href="${pageContext.request.contextPath}/plugins/datatables/dataTables.bootstrap.css">
    34. <link rel="stylesheet"
    35. href="${pageContext.request.contextPath}/plugins/treeTable/jquery.treetable.css">
    36. <link rel="stylesheet"
    37. href="${pageContext.request.contextPath}/plugins/treeTable/jquery.treetable.theme.default.css">
    38. <link rel="stylesheet"
    39. href="${pageContext.request.contextPath}/plugins/select2/select2.css">
    40. <link rel="stylesheet"
    41. href="${pageContext.request.contextPath}/plugins/colorpicker/bootstrap-colorpicker.min.css">
    42. <link rel="stylesheet"
    43. href="${pageContext.request.contextPath}/plugins/bootstrap-markdown/css/bootstrap-markdown.min.css">
    44. <link rel="stylesheet"
    45. href="${pageContext.request.contextPath}/plugins/adminLTE/css/AdminLTE.css">
    46. <link rel="stylesheet"
    47. href="${pageContext.request.contextPath}/plugins/adminLTE/css/skins/_all-skins.min.css">
    48. <link rel="stylesheet"
    49. href="${pageContext.request.contextPath}/css/style.css">
    50. <link rel="stylesheet"
    51. href="${pageContext.request.contextPath}/plugins/ionslider/ion.rangeSlider.css">
    52. <link rel="stylesheet"
    53. href="${pageContext.request.contextPath}/plugins/ionslider/ion.rangeSlider.skinNice.css">
    54. <link rel="stylesheet"
    55. href="${pageContext.request.contextPath}/plugins/bootstrap-slider/slider.css">
    56. <link rel="stylesheet"
    57. href="${pageContext.request.contextPath}/plugins/bootstrap-datetimepicker/bootstrap-datetimepicker.css">
    58. head>
    59. <body class="hold-transition skin-purple sidebar-mini">
    60. <div class="wrapper">
    61. <jsp:include page="header.jsp">jsp:include>
    62. <jsp:include page="aside.jsp">jsp:include>
    63. <div class="content-wrapper">
    64. <section class="content-header">
    65. <h1>
    66. 用户管理 <small>用户表单small>
    67. h1>
    68. <ol class="breadcrumb">
    69. <li><a href="${pageContext.request.contextPath}/index.jsp"><i
    70. class="fa fa-dashboard">i> 首页a>li>
    71. <li><a
    72. href="${pageContext.request.contextPath}/user/findAll.do">用户管理a>li>
    73. <li class="active">用户表单li>
    74. ol>
    75. section>
    76. <form action="${pageContext.request.contextPath}/user/save.do"
    77. method="post">
    78. <section class="content">
    79. <div class="panel panel-default">
    80. <div class="panel-heading">用户信息div>
    81. <div class="row data-type">
    82. <div class="col-md-2 title">用户名称div>
    83. <div class="col-md-4 data">
    84. <input type="text" class="form-control" name="username"
    85. placeholder="用户名称" value="">
    86. div>
    87. <div class="col-md-2 title">密码div>
    88. <div class="col-md-4 data">
    89. <input type="password" class="form-control" name="password"
    90. placeholder="密码" value="">
    91. div>
    92. <div class="col-md-2 title">邮箱div>
    93. <div class="col-md-4 data">
    94. <input type="text" class="form-control" name="email"
    95. placeholder="邮箱" value="">
    96. div>
    97. <div class="col-md-2 title">联系电话div>
    98. <div class="col-md-4 data">
    99. <input type="text" class="form-control" name="phoneNum"
    100. placeholder="联系电话" value="">
    101. div>
    102. <div class="col-md-2 title">用户状态div>
    103. <div class="col-md-4 data">
    104. <select class="form-control select2" style="width: 100%"
    105. name="status">
    106. <option value="0" selected="selected">关闭option>
    107. <option value="1">开启option>
    108. select>
    109. div>
    110. div>
    111. div>
    112. <div class="box-tools text-center">
    113. <button type="submit" class="btn bg-maroon">保存button>
    114. <button type="button" class="btn bg-default"
    115. onclick="history.back(-1);">返回button>
    116. div>
    117. section>
    118. form>
    119. div>
    120. <footer class="main-footer">
    121. <div class="pull-right hidden-xs">
    122. <b>Versionb> 1.0.8
    123. div>
    124. <strong>Copyright © 2014-2017 <a
    125. href="http://www.itcast.cn">研究院研发部a>.
    126. strong> All rights reserved. footer>
    127. div>
    128. <script
    129. src="${pageContext.request.contextPath}/plugins/jQuery/jquery-2.2.3.min.js">script>
    130. <script
    131. src="${pageContext.request.contextPath}/plugins/jQueryUI/jquery-ui.min.js">script>
    132. <script>
    133. $.widget.bridge('uibutton', $.ui.button);
    134. script>
    135. <script
    136. src="${pageContext.request.contextPath}/plugins/bootstrap/js/bootstrap.min.js">script>
    137. <script
    138. src="${pageContext.request.contextPath}/plugins/raphael/raphael-min.js">script>
    139. <script
    140. src="${pageContext.request.contextPath}/plugins/morris/morris.min.js">script>
    141. <script
    142. src="${pageContext.request.contextPath}/plugins/sparkline/jquery.sparkline.min.js">script>
    143. <script
    144. src="${pageContext.request.contextPath}/plugins/jvectormap/jquery-jvectormap-1.2.2.min.js">script>
    145. <script
    146. src="${pageContext.request.contextPath}/plugins/jvectormap/jquery-jvectormap-world-mill-en.js">script>
    147. <script
    148. src="${pageContext.request.contextPath}/plugins/knob/jquery.knob.js">script>
    149. <script
    150. src="${pageContext.request.contextPath}/plugins/daterangepicker/moment.min.js">script>
    151. <script
    152. src="${pageContext.request.contextPath}/plugins/daterangepicker/daterangepicker.js">script>
    153. <script
    154. src="${pageContext.request.contextPath}/plugins/daterangepicker/daterangepicker.zh-CN.js">script>
    155. <script
    156. src="${pageContext.request.contextPath}/plugins/datepicker/bootstrap-datepicker.js">script>
    157. <script
    158. src="${pageContext.request.contextPath}/plugins/datepicker/locales/bootstrap-datepicker.zh-CN.js">script>
    159. <script
    160. src="${pageContext.request.contextPath}/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.all.min.js">script>
    161. <script
    162. src="${pageContext.request.contextPath}/plugins/slimScroll/jquery.slimscroll.min.js">script>
    163. <script
    164. src="${pageContext.request.contextPath}/plugins/fastclick/fastclick.js">script>
    165. <script
    166. src="${pageContext.request.contextPath}/plugins/iCheck/icheck.min.js">script>
    167. <script
    168. src="${pageContext.request.contextPath}/plugins/adminLTE/js/app.min.js">script>
    169. <script
    170. src="${pageContext.request.contextPath}/plugins/treeTable/jquery.treetable.js">script>
    171. <script
    172. src="${pageContext.request.contextPath}/plugins/select2/select2.full.min.js">script>
    173. <script
    174. src="${pageContext.request.contextPath}/plugins/colorpicker/bootstrap-colorpicker.min.js">script>
    175. <script
    176. src="${pageContext.request.contextPath}/plugins/bootstrap-wysihtml5/bootstrap-wysihtml5.zh-CN.js">script>
    177. <script
    178. src="${pageContext.request.contextPath}/plugins/bootstrap-markdown/js/bootstrap-markdown.js">script>
    179. <script
    180. src="${pageContext.request.contextPath}/plugins/bootstrap-markdown/locale/bootstrap-markdown.zh.js">script>
    181. <script
    182. src="${pageContext.request.contextPath}/plugins/bootstrap-markdown/js/markdown.js">script>
    183. <script
    184. src="${pageContext.request.contextPath}/plugins/bootstrap-markdown/js/to-markdown.js">script>
    185. <script
    186. src="${pageContext.request.contextPath}/plugins/ckeditor/ckeditor.js">script>
    187. <script
    188. src="${pageContext.request.contextPath}/plugins/input-mask/jquery.inputmask.js">script>
    189. <script
    190. src="${pageContext.request.contextPath}/plugins/input-mask/jquery.inputmask.date.extensions.js">script>
    191. <script
    192. src="${pageContext.request.contextPath}/plugins/input-mask/jquery.inputmask.extensions.js">script>
    193. <script
    194. src="${pageContext.request.contextPath}/plugins/datatables/jquery.dataTables.min.js">script>
    195. <script
    196. src="${pageContext.request.contextPath}/plugins/datatables/dataTables.bootstrap.min.js">script>
    197. <script
    198. src="${pageContext.request.contextPath}/plugins/chartjs/Chart.min.js">script>
    199. <script
    200. src="${pageContext.request.contextPath}/plugins/flot/jquery.flot.min.js">script>
    201. <script
    202. src="${pageContext.request.contextPath}/plugins/flot/jquery.flot.resize.min.js">script>
    203. <script
    204. src="${pageContext.request.contextPath}/plugins/flot/jquery.flot.pie.min.js">script>
    205. <script
    206. src="${pageContext.request.contextPath}/plugins/flot/jquery.flot.categories.min.js">script>
    207. <script
    208. src="${pageContext.request.contextPath}/plugins/ionslider/ion.rangeSlider.min.js">script>
    209. <script
    210. src="${pageContext.request.contextPath}/plugins/bootstrap-slider/bootstrap-slider.js">script>
    211. <script
    212. src="${pageContext.request.contextPath}/plugins/bootstrap-datetimepicker/bootstrap-datetimepicker.min.js">script>
    213. <script>
    214. $(document).ready(function() {
    215. // 选择框
    216. $(".select2").select2();
    217. // WYSIHTML5编辑器
    218. $(".textarea").wysihtml5({
    219. locale : 'zh-CN'
    220. });
    221. });
    222. // 设置激活菜单
    223. function setSidebarActive(tagUri) {
    224. var liObj = $("#" + tagUri);
    225. if (liObj.length > 0) {
    226. liObj.parent().parent().addClass("active");
    227. liObj.addClass("active");
    228. }
    229. }
    230. script>
    231. body>
    232. html>
    3.4.2.UserController
    1. @Controller
    2. @RequestMapping("/user")
    3. public class UserControlller {
    4. @Autowired
    5. private IUserService userService;
    6. @RequestMapping("/save.do")
    7. public String save(UserInfo user) throws Exception {
    8. userService.save(user);
    9. return "redirect:findAll.do";
    10. }
    11. }
    3.4.3.Service
    1. @Service("userService")
    2. @Transactional
    3. public class UserServiceImpl implements IUserService {
    4. @Autowired
    5. private IUserDao userDao;
    6. @Autowired
    7. private PasswordEncoder passwordEncoder;
    8. @Override
    9. public void save(UserInfo user) throws Exception {
    10. user.setPassword(passwordEncoder.encode(user.getPassword()));
    11. userDao.save(user);
    12. }
    13. }
    前期我们的用户密码没有加密,现在添加用户时,我们需要对用户密码进行加密
    1. <bean id="passwordEncoder"
    2. class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>
    3.4. 4.Dao
    1. @Insert("insert into user(email,username,password,phoneNum,status) value(#{email},#
    2. {username},#{password},#{phoneNum},#{status})")
    3. public void save(UserInfo user) throws Exception;
    3.5 用户详情
    3.5.1. 用户详情页面 user-show.jsp
    请在资料中查看页面详细代码
    注意:需要添加 js
    $("#collapse-table").treetable({ expandable : true });
    3.5.2.UserController
    1. @Controller
    2. @RequestMapping("/user")
    3. public class UserControlller {
    4. @Autowired
    5. private IUserService userService;
    6. @RequestMapping("/findById.do")
    7. public ModelAndView findById(@RequestParam(name = "id", required = true) Long id) throws
    8. Exception {
    9. UserInfo user = userService.findById(id);
    10. ModelAndView mv = new ModelAndView();
    11. mv.addObject("user", user);
    12. mv.setViewName("user-show");
    13. return mv;
    14. }
    15. }
    3.5.3.Dao
    1. @Select("select * from user where id=#{id}")
    2. @Results({ @Result(id = true, property = "id", column = "id"), @Result(column = "username",
    3. property = "username"),
    4. @Result(column = "email", property = "email"), @Result(column =
    5. "password", property = "password"),
    6. @Result(column = "phoneNum", property = "phoneNum"), @Result(column =
    7. "status", property = "status"),
    8. @Result(column = "id", property = "roles", javaType = List.class, many =
    9. @Many(select = "com.itheima.ssm.dao.IRoleDao.findRoleByUserId")) })
    10. public UserInfo findById(Long id) throws Exception;
    11. @Select("select * from role where id in( select roleId from user_role where userId=#{userId})")
    12. @Results(
    13. {
    14. @Result(id=true,column="id",property="id"),
    15. @Result(column="roleName",property="roleName"),
    16. @Result(column="roleDesc",property="roleDesc"),
    17. @Result(column="id",property="permissions",javaType=List.class,many=@Many(select="com.itheima.ssm
    18. .dao.IPermissionDao.findByRoleId"))
    19. })
    20. public List findRoleByUserId(Long userId);
    我们需要将用户的所有角色及权限查询出来所以需要调用 IRoleDao 中的 fifindRoleByUserId, 而在 IRoleDao 中需要调用IPermissionDao fifindByRoleId
    1. @Select("select * from permission where id in (select permissionId from role_permission where
    2. roleId=#{roleId})")
    3. public List findByRoleId(Long roleId);
    4. 角色管理
    4.1 角色查询
    4.1.1. 角色页面 role-list.jsp
    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    4. html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    5. <html>
    6. <head>
    7. <meta charset="utf-8">
    8. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    9. <title>数据 - AdminLTE2定制版title>
    10. <meta name="description" content="AdminLTE2定制版">
    11. <meta name="keywords" content="AdminLTE2定制版">
    12. <meta
    13. content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"
    14. name="viewport">
    15. <link rel="stylesheet"
    16. href="${pageContext.request.contextPath}/plugins/bootstrap/css/bootstrap.min.css">
    17. <link rel="stylesheet"
    18. href="${pageContext.request.contextPath}/plugins/font-awesome/css/font-awesome.min.css">
    19. <link rel="stylesheet"
    20. href="${pageContext.request.contextPath}/plugins/ionicons/css/ionicons.min.css">
    21. <link rel="stylesheet"
    22. href="${pageContext.request.contextPath}/plugins/iCheck/square/blue.css">
    23. <link rel="stylesheet"
    24. href="${pageContext.request.contextPath}/plugins/morris/morris.css">
    25. <link rel="stylesheet"
    26. href="${pageContext.request.contextPath}/plugins/jvectormap/jquery-jvectormap-1.2.2.css">
    27. <link rel="stylesheet"
    28. href="${pageContext.request.contextPath}/plugins/datepicker/datepicker3.css">
    29. <link rel="stylesheet"
    30. href="${pageContext.request.contextPath}/plugins/daterangepicker/daterangepicker.css">
    31. <link rel="stylesheet"
    32. href="${pageContext.request.contextPath}/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.min.css">
    33. <link rel="stylesheet"
    34. href="${pageContext.request.contextPath}/plugins/datatables/dataTables.bootstrap.css">
    35. <link rel="stylesheet"
    36. href="${pageContext.request.contextPath}/plugins/treeTable/jquery.treetable.css">
    37. <link rel="stylesheet"
    38. href="${pageContext.request.contextPath}/plugins/treeTable/jquery.treetable.theme.default.css">
    39. <link rel="stylesheet"
    40. href="${pageContext.request.contextPath}/plugins/select2/select2.css">
    41. <link rel="stylesheet"
    42. href="${pageContext.request.contextPath}/plugins/colorpicker/bootstrap-colorpicker.min.css">
    43. <link rel="stylesheet"
    44. href="${pageContext.request.contextPath}/plugins/bootstrap-markdown/css/bootstrap-markdown.min.css">
    45. <link rel="stylesheet"
    46. href="${pageContext.request.contextPath}/plugins/adminLTE/css/AdminLTE.css">
    47. <link rel="stylesheet"
    48. href="${pageContext.request.contextPath}/plugins/adminLTE/css/skins/_all-skins.min.css">
    49. <link rel="stylesheet"
    50. href="${pageContext.request.contextPath}/css/style.css">
    51. <link rel="stylesheet"
    52. href="${pageContext.request.contextPath}/plugins/ionslider/ion.rangeSlider.css">
    53. <link rel="stylesheet"
    54. href="${pageContext.request.contextPath}/plugins/ionslider/ion.rangeSlider.skinNice.css">
    55. <link rel="stylesheet"
    56. href="${pageContext.request.contextPath}/plugins/bootstrap-slider/slider.css">
    57. head>
    58. <body class="hold-transition skin-blue sidebar-mini">
    59. <div class="wrapper">
    60. <jsp:include page="header.jsp">jsp:include>
    61. <jsp:include page="aside.jsp">jsp:include>
    62. <div class="content-wrapper">
    63. <section class="content-header">
    64. <h1>
    65. 角色管理 <small>全部角色small>
    66. h1>
    67. <ol class="breadcrumb">
    68. <li><a href="${pageContext.request.contextPath}/index.jsp"><i
    69. class="fa fa-dashboard">i> 首页a>li>
    70. <li><a
    71. href="${pageContext.request.contextPath}/role/findAll.do">角色管理a>li>
    72. <li class="active">全部角色li>
    73. ol>
    74. section>
    75. <section class="content">
    76. <div class="box box-primary">
    77. <div class="box-header with-border">
    78. <h3 class="box-title">列表h3>
    79. div>
    80. <div class="box-body">
    81. <div class="table-box">
    82. <div class="pull-left">
    83. <div class="form-group form-inline">
    84. <div class="btn-group">
    85. <button type="button" class="btn btn-default" title="新建" onclick="location.href='${pageContext.request.contextPath}/pages/role-add.jsp'">
    86. <i class="fa fa-file-o">i> 新建
    87. button>
    88. <button type="button" class="btn btn-default" title="刷新">
    89. <i class="fa fa-refresh">i> 刷新
    90. button>
    91. div>
    92. div>
    93. div>
    94. <div class="box-tools pull-right">
    95. <div class="has-feedback">
    96. <input type="text" class="form-control input-sm"
    97. placeholder="搜索"> <span
    98. class="glyphicon glyphicon-search form-control-feedback">span>
    99. div>
    100. div>
    101. <table id="dataList"
    102. class="table table-bordered table-striped table-hover dataTable">
    103. <thead>
    104. <tr>
    105. <th class="" style="padding-right: 0px"><input
    106. id="selall" type="checkbox" class="icheckbox_square-blue">
    107. th>
    108. <th class="sorting_asc">IDth>
    109. <th class="sorting_desc">角色名称th>
    110. <th class="sorting_asc sorting_asc_disabled">描述th>
    111. <th class="text-center">操作th>
    112. tr>
    113. thead>
    114. <tbody>
    115. <c:forEach items="${roleList}" var="role">
    116. <tr>
    117. <td><input name="ids" type="checkbox">td>
    118. <td>${role.id }td>
    119. <td>${role.roleName }td>
    120. <td>${role.roleDesc }td>
    121. <td class="text-center">
    122. <a href="${pageContext.request.contextPath}/role/findById.do?id=${role.id}" class="btn bg-olive btn-xs">详情a>
    123. <a href="${pageContext.request.contextPath}/role/deleteRole.do?id=${role.id}" class="btn bg-olive btn-xs">删除角色a>
    124. <a href="${pageContext.request.contextPath}/role/findRoleByIdAndAllPermission.do?id=${role.id}" class="btn bg-olive btn-xs">添加权限a>
    125. td>
    126. tr>
    127. c:forEach>
    128. tbody>
    129. table>
    130. div>
    131. div>
    132. <div class="box-footer">
    133. <div class="pull-left">
    134. <div class="form-group form-inline">
    135. 总共2 页,共14 条数据。 每页 <select class="form-control">
    136. <option>1option>
    137. <option>2option>
    138. <option>3option>
    139. <option>4option>
    140. <option>5option>
    141. select> 条
    142. div>
    143. div>
    144. <div class="box-tools pull-right">
    145. <ul class="pagination">
    146. <li><a href="#" aria-label="Previous">首页a>li>
    147. <li><a href="#">上一页a>li>
    148. <li><a href="#">1a>li>
    149. <li><a href="#">2a>li>
    150. <li><a href="#">3a>li>
    151. <li><a href="#">4a>li>
    152. <li><a href="#">5a>li>
    153. <li><a href="#">下一页a>li>
    154. <li><a href="#" aria-label="Next">尾页a>li>
    155. ul>
    156. div>
    157. div>
    158. div>
    159. section>
    160. div>
    161. <footer class="main-footer">
    162. <div class="pull-right hidden-xs">
    163. <b>Versionb> 1.0.8
    164. div>
    165. <strong>Copyright © 2014-2017 <a
    166. href="http://www.itcast.cn">研究院研发部a>.
    167. strong> All rights reserved. footer>
    168. div>
    169. <script src="../plugins/jQuery/jquery-2.2.3.min.js">script>
    170. <script src="../plugins/jQueryUI/jquery-ui.min.js">script>
    171. <script>
    172. $.widget.bridge('uibutton', $.ui.button);
    173. script>
    174. <script src="../plugins/bootstrap/js/bootstrap.min.js">script>
    175. <script src="../plugins/raphael/raphael-min.js">script>
    176. <script src="../plugins/morris/morris.min.js">script>
    177. <script src="../plugins/sparkline/jquery.sparkline.min.js">script>
    178. <script src="../plugins/jvectormap/jquery-jvectormap-1.2.2.min.js">script>
    179. <script src="../plugins/jvectormap/jquery-jvectormap-world-mill-en.js">script>
    180. <script src="../plugins/knob/jquery.knob.js">script>
    181. <script src="../plugins/daterangepicker/moment.min.js">script>
    182. <script src="../plugins/daterangepicker/daterangepicker.js">script>
    183. <script src="../plugins/daterangepicker/daterangepicker.zh-CN.js">script>
    184. <script src="../plugins/datepicker/bootstrap-datepicker.js">script>
    185. <script
    186. src="../plugins/datepicker/locales/bootstrap-datepicker.zh-CN.js">script>
    187. <script
    188. src="../plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.all.min.js">script>
    189. <script src="../plugins/slimScroll/jquery.slimscroll.min.js">script>
    190. <script src="../plugins/fastclick/fastclick.js">script>
    191. <script src="../plugins/iCheck/icheck.min.js">script>
    192. <script src="../plugins/adminLTE/js/app.min.js">script>
    193. <script src="../plugins/treeTable/jquery.treetable.js">script>
    194. <script src="../plugins/select2/select2.full.min.js">script>
    195. <script src="../plugins/colorpicker/bootstrap-colorpicker.min.js">script>
    196. <script
    197. src="../plugins/bootstrap-wysihtml5/bootstrap-wysihtml5.zh-CN.js">script>
    198. <script src="../plugins/bootstrap-markdown/js/bootstrap-markdown.js">script>
    199. <script
    200. src="../plugins/bootstrap-markdown/locale/bootstrap-markdown.zh.js">script>
    201. <script src="../plugins/bootstrap-markdown/js/markdown.js">script>
    202. <script src="../plugins/bootstrap-markdown/js/to-markdown.js">script>
    203. <script src="../plugins/ckeditor/ckeditor.js">script>
    204. <script src="../plugins/input-mask/jquery.inputmask.js">script>
    205. <script
    206. src="../plugins/input-mask/jquery.inputmask.date.extensions.js">script>
    207. <script src="../plugins/input-mask/jquery.inputmask.extensions.js">script>
    208. <script src="../plugins/datatables/jquery.dataTables.min.js">script>
    209. <script src="../plugins/datatables/dataTables.bootstrap.min.js">script>
    210. <script src="../plugins/chartjs/Chart.min.js">script>
    211. <script src="../plugins/flot/jquery.flot.min.js">script>
    212. <script src="../plugins/flot/jquery.flot.resize.min.js">script>
    213. <script src="../plugins/flot/jquery.flot.pie.min.js">script>
    214. <script src="../plugins/flot/jquery.flot.categories.min.js">script>
    215. <script src="../plugins/ionslider/ion.rangeSlider.min.js">script>
    216. <script src="../plugins/bootstrap-slider/bootstrap-slider.js">script>
    217. <script>
    218. $(document).ready(function() {
    219. // 选择框
    220. $(".select2").select2();
    221. // WYSIHTML5编辑器
    222. $(".textarea").wysihtml5({
    223. locale : 'zh-CN'
    224. });
    225. });
    226. // 设置激活菜单
    227. function setSidebarActive(tagUri) {
    228. var liObj = $("#" + tagUri);
    229. if (liObj.length > 0) {
    230. liObj.parent().parent().addClass("active");
    231. liObj.addClass("active");
    232. }
    233. }
    234. $(document)
    235. .ready(
    236. function() {
    237. // 激活导航位置
    238. setSidebarActive("admin-datalist");
    239. // 列表按钮
    240. $("#dataList td input[type='checkbox']")
    241. .iCheck(
    242. {
    243. checkboxClass : 'icheckbox_square-blue',
    244. increaseArea : '20%'
    245. });
    246. // 全选操作
    247. $("#selall")
    248. .click(
    249. function() {
    250. var clicks = $(this).is(
    251. ':checked');
    252. if (!clicks) {
    253. $(
    254. "#dataList td input[type='checkbox']")
    255. .iCheck(
    256. "uncheck");
    257. } else {
    258. $(
    259. "#dataList td input[type='checkbox']")
    260. .iCheck("check");
    261. }
    262. $(this).data("clicks",
    263. !clicks);
    264. });
    265. });
    266. script>
    267. body>
    268. html>
    4.1.2.RoleControlller
    1. @RequestMapping("/role")
    2. @Controller
    3. public class RoleController {
    4. @Autowired
    5. private IRoleService roleService;
    6. @RequestMapping("/findAll.do")
    7. public ModelAndView findAll() throws Exception {
    8. List roleList = roleService.findAll();
    9. ModelAndView mv = new ModelAndView();
    10. mv.addObject("roleList", roleList);
    11. mv.setViewName("role-list");
    12. return mv;
    13. }
    4.1.3.Dao
    1. @Select("select * from role")
    2. public List findAll();
    4.2 角色添加
    4.2.1. 角色添加页面 role-add.jsp
    请在页面中查看详细代码
    4.2.2.RoleControlller
    1. @RequestMapping("/role")
    2. @Controller
    3. public class RoleController {
    4. @Autowired
    5. private IRoleService roleService;
    6. @RequestMapping("/save.do")
    7. public String save(Role role) {
    8. roleService.save(role);
    9. return "redirect:findAll.do";
    10. }
    11. }
    4.2.3.Dao
    1. @Insert("insert into role(roleName,roleDesc) value(#{roleName},#{roleDesc})")
    2. public void save(Role role);
    5. 资源权限管理
    5.1 资源权限查询
    5.1.1. 权限资源页面 permission-list.jsp
    请在资料中查看详细代码
    5.1.2.PermissionController
    1. @RequestMapping("/permission")
    2. @Controller
    3. public class PermissionController {
    4. @Autowired
    5. private IPermissionService permissionService;
    6. @RequestMapping("/findAll.do")
    7. public ModelAndView findAll() throws Exception {
    8. List permissionList = permissionService.findAll();
    9. ModelAndView mv = new ModelAndView();
    10. mv.addObject("permissionList", permissionList);
    11. mv.setViewName("permission-list");
    12. return mv;
    13. }
    14. }
    5.1.3.Dao
    1. @Select("select * from permission")
    2. public List findAll();
    5.2 资源权限添加
    5.2.1. 权限资源添加页面 permission-add.jsp
    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    4. <html>
    5. <head>
    6. <meta charset="utf-8">
    7. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    8. <title>数据 - AdminLTE2定制版title>
    9. <meta name="description" content="AdminLTE2定制版">
    10. <meta name="keywords" content="AdminLTE2定制版">
    11. <meta
    12. content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"
    13. name="viewport">
    14. <link rel="stylesheet"
    15. href="${pageContext.request.contextPath}/plugins/bootstrap/css/bootstrap.min.css">
    16. <link rel="stylesheet"
    17. href="${pageContext.request.contextPath}/plugins/font-awesome/css/font-awesome.min.css">
    18. <link rel="stylesheet"
    19. href="${pageContext.request.contextPath}/plugins/ionicons/css/ionicons.min.css">
    20. <link rel="stylesheet"
    21. href="${pageContext.request.contextPath}/plugins/iCheck/square/blue.css">
    22. <link rel="stylesheet"
    23. href="${pageContext.request.contextPath}/plugins/morris/morris.css">
    24. <link rel="stylesheet"
    25. href="${pageContext.request.contextPath}/plugins/jvectormap/jquery-jvectormap-1.2.2.css">
    26. <link rel="stylesheet"
    27. href="${pageContext.request.contextPath}/plugins/datepicker/datepicker3.css">
    28. <link rel="stylesheet"
    29. href="${pageContext.request.contextPath}/plugins/daterangepicker/daterangepicker.css">
    30. <link rel="stylesheet"
    31. href="${pageContext.request.contextPath}/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.min.css">
    32. <link rel="stylesheet"
    33. href="${pageContext.request.contextPath}/plugins/datatables/dataTables.bootstrap.css">
    34. <link rel="stylesheet"
    35. href="${pageContext.request.contextPath}/plugins/treeTable/jquery.treetable.css">
    36. <link rel="stylesheet"
    37. href="${pageContext.request.contextPath}/plugins/treeTable/jquery.treetable.theme.default.css">
    38. <link rel="stylesheet"
    39. href="${pageContext.request.contextPath}/plugins/select2/select2.css">
    40. <link rel="stylesheet"
    41. href="${pageContext.request.contextPath}/plugins/colorpicker/bootstrap-colorpicker.min.css">
    42. <link rel="stylesheet"
    43. href="${pageContext.request.contextPath}/plugins/bootstrap-markdown/css/bootstrap-markdown.min.css">
    44. <link rel="stylesheet"
    45. href="${pageContext.request.contextPath}/plugins/adminLTE/css/AdminLTE.css">
    46. <link rel="stylesheet"
    47. href="${pageContext.request.contextPath}/plugins/adminLTE/css/skins/_all-skins.min.css">
    48. <link rel="stylesheet"
    49. href="${pageContext.request.contextPath}/css/style.css">
    50. <link rel="stylesheet"
    51. href="${pageContext.request.contextPath}/plugins/ionslider/ion.rangeSlider.css">
    52. <link rel="stylesheet"
    53. href="${pageContext.request.contextPath}/plugins/ionslider/ion.rangeSlider.skinNice.css">
    54. <link rel="stylesheet"
    55. href="${pageContext.request.contextPath}/plugins/bootstrap-slider/slider.css">
    56. <link rel="stylesheet"
    57. href="${pageContext.request.contextPath}/plugins/bootstrap-datetimepicker/bootstrap-datetimepicker.css">
    58. head>
    59. <body class="hold-transition skin-purple sidebar-mini">
    60. <div class="wrapper">
    61. <jsp:include page="header.jsp">jsp:include>
    62. <jsp:include page="aside.jsp">jsp:include>
    63. <div class="content-wrapper">
    64. <section class="content-header">
    65. <h1>
    66. 资源权限管理 <small>资源权限表单small>
    67. h1>
    68. <ol class="breadcrumb">
    69. <li><a href="${pageContext.request.contextPath}/index.jsp"><i
    70. class="fa fa-dashboard">i> 首页a>li>
    71. <li><a href="${pageContext.request.contextPath}/permission/findAll.do">资源权限管理a>li>
    72. <li class="active">资源权限表单li>
    73. ol>
    74. section>
    75. <form action="${pageContext.request.contextPath}/permission/save.do"
    76. method="post">
    77. <section class="content">
    78. <div class="panel panel-default">
    79. <div class="panel-heading">资源权限信息div>
    80. <div class="row data-type">
    81. <div class="col-md-2 title">权限名称div>
    82. <div class="col-md-4 data">
    83. <input type="text" class="form-control" name="permissionName"
    84. placeholder="权限名称" value="">
    85. div>
    86. <div class="col-md-2 title">RULdiv>
    87. <div class="col-md-4 data">
    88. <input type="text" class="form-control" name="url"
    89. placeholder="URL" value="">
    90. div>
    91. div>
    92. div>
    93. <div class="box-tools text-center">
    94. <button type="submit" class="btn bg-maroon">保存button>
    95. <button type="button" class="btn bg-default"
    96. onclick="history.back(-1);">返回button>
    97. div>
    98. section>
    99. form>
    100. div>
    101. <footer class="main-footer">
    102. <div class="pull-right hidden-xs">
    103. <b>Versionb> 1.0.8
    104. div>
    105. <strong>Copyright © 2014-2017 <a
    106. href="http://www.itcast.cn">研究院研发部a>.
    107. strong> All rights reserved. footer>
    108. div>
    109. <script
    110. src="${pageContext.request.contextPath}/plugins/jQuery/jquery-2.2.3.min.js">script>
    111. <script
    112. src="${pageContext.request.contextPath}/plugins/jQueryUI/jquery-ui.min.js">script>
    113. <script>
    114. $.widget.bridge('uibutton', $.ui.button);
    115. script>
    116. <script
    117. src="${pageContext.request.contextPath}/plugins/bootstrap/js/bootstrap.min.js">script>
    118. <script
    119. src="${pageContext.request.contextPath}/plugins/raphael/raphael-min.js">script>
    120. <script
    121. src="${pageContext.request.contextPath}/plugins/morris/morris.min.js">script>
    122. <script
    123. src="${pageContext.request.contextPath}/plugins/sparkline/jquery.sparkline.min.js">script>
    124. <script
    125. src="${pageContext.request.contextPath}/plugins/jvectormap/jquery-jvectormap-1.2.2.min.js">script>
    126. <script
    127. src="${pageContext.request.contextPath}/plugins/jvectormap/jquery-jvectormap-world-mill-en.js">script>
    128. <script
    129. src="${pageContext.request.contextPath}/plugins/knob/jquery.knob.js">script>
    130. <script
    131. src="${pageContext.request.contextPath}/plugins/daterangepicker/moment.min.js">script>
    132. <script
    133. src="${pageContext.request.contextPath}/plugins/daterangepicker/daterangepicker.js">script>
    134. <script
    135. src="${pageContext.request.contextPath}/plugins/daterangepicker/daterangepicker.zh-CN.js">script>
    136. <script
    137. src="${pageContext.request.contextPath}/plugins/datepicker/bootstrap-datepicker.js">script>
    138. <script
    139. src="${pageContext.request.contextPath}/plugins/datepicker/locales/bootstrap-datepicker.zh-CN.js">script>
    140. <script
    141. src="${pageContext.request.contextPath}/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.all.min.js">script>
    142. <script
    143. src="${pageContext.request.contextPath}/plugins/slimScroll/jquery.slimscroll.min.js">script>
    144. <script
    145. src="${pageContext.request.contextPath}/plugins/fastclick/fastclick.js">script>
    146. <script
    147. src="${pageContext.request.contextPath}/plugins/iCheck/icheck.min.js">script>
    148. <script
    149. src="${pageContext.request.contextPath}/plugins/adminLTE/js/app.min.js">script>
    150. <script
    151. src="${pageContext.request.contextPath}/plugins/treeTable/jquery.treetable.js">script>
    152. <script
    153. src="${pageContext.request.contextPath}/plugins/select2/select2.full.min.js">script>
    154. <script
    155. src="${pageContext.request.contextPath}/plugins/colorpicker/bootstrap-colorpicker.min.js">script>
    156. <script
    157. src="${pageContext.request.contextPath}/plugins/bootstrap-wysihtml5/bootstrap-wysihtml5.zh-CN.js">script>
    158. <script
    159. src="${pageContext.request.contextPath}/plugins/bootstrap-markdown/js/bootstrap-markdown.js">script>
    160. <script
    161. src="${pageContext.request.contextPath}/plugins/bootstrap-markdown/locale/bootstrap-markdown.zh.js">script>
    162. <script
    163. src="${pageContext.request.contextPath}/plugins/bootstrap-markdown/js/markdown.js">script>
    164. <script
    165. src="${pageContext.request.contextPath}/plugins/bootstrap-markdown/js/to-markdown.js">script>
    166. <script
    167. src="${pageContext.request.contextPath}/plugins/ckeditor/ckeditor.js">script>
    168. <script
    169. src="${pageContext.request.contextPath}/plugins/input-mask/jquery.inputmask.js">script>
    170. <script
    171. src="${pageContext.request.contextPath}/plugins/input-mask/jquery.inputmask.date.extensions.js">script>
    172. <script
    173. src="${pageContext.request.contextPath}/plugins/input-mask/jquery.inputmask.extensions.js">script>
    174. <script
    175. src="${pageContext.request.contextPath}/plugins/datatables/jquery.dataTables.min.js">script>
    176. <script
    177. src="${pageContext.request.contextPath}/plugins/datatables/dataTables.bootstrap.min.js">script>
    178. <script
    179. src="${pageContext.request.contextPath}/plugins/chartjs/Chart.min.js">script>
    180. <script
    181. src="${pageContext.request.contextPath}/plugins/flot/jquery.flot.min.js">script>
    182. <script
    183. src="${pageContext.request.contextPath}/plugins/flot/jquery.flot.resize.min.js">script>
    184. <script
    185. src="${pageContext.request.contextPath}/plugins/flot/jquery.flot.pie.min.js">script>
    186. <script
    187. src="${pageContext.request.contextPath}/plugins/flot/jquery.flot.categories.min.js">script>
    188. <script
    189. src="${pageContext.request.contextPath}/plugins/ionslider/ion.rangeSlider.min.js">script>
    190. <script
    191. src="${pageContext.request.contextPath}/plugins/bootstrap-slider/bootstrap-slider.js">script>
    192. <script
    193. src="${pageContext.request.contextPath}/plugins/bootstrap-datetimepicker/bootstrap-datetimepicker.min.js">script>
    194. <script>
    195. $(document).ready(function() {
    196. // 选择框
    197. $(".select2").select2();
    198. // WYSIHTML5编辑器
    199. $(".textarea").wysihtml5({
    200. locale : 'zh-CN'
    201. });
    202. });
    203. // 设置激活菜单
    204. function setSidebarActive(tagUri) {
    205. var liObj = $("#" + tagUri);
    206. if (liObj.length > 0) {
    207. liObj.parent().parent().addClass("active");
    208. liObj.addClass("active");
    209. }
    210. }
    211. script>
    212. body>
    213. html>

    5.2.2.PermissionController

    1. @RequestMapping("/permission")
    2. @Controller
    3. public class PermissionController {
    4. @Autowired
    5. private IPermissionService permissionService;
    6. @RequestMapping("/save.do")
    7. public String save(Permission p) throws Exception {
    8. permissionService.save(p);
    9. return "redirect:findAll.do";
    10. }
    11. }
    5.2.3.Dao
    1. @Insert("insert into permission(permissionName,url) value(#{permissionName},#{url})")
    2. public void save(Permission p);
    6. 权限关联与控制
    6.1 用户角色关联
    用户与角色之间是多对多关系,我们要建立它们之间的关系,只需要在中间表 user_role 插入数据即可。
    6.1.1. 用户角色关联相关页面
    user-list.jsp 页面上添加链接
    1. <a href="${pageContext.request.contextPath}/user/findUserByIdAndAllRole.do?id=${user.id}"
    2. class="btn bg-olive btn-xs">添加角色a>
    展示可以添加角色的页面 user-role-add.jsp
    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    4. html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    5. <html>
    6. <head>
    7. <meta charset="utf-8">
    8. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    9. <title>数据 - AdminLTE2定制版title>
    10. <meta name="description" content="AdminLTE2定制版">
    11. <meta name="keywords" content="AdminLTE2定制版">
    12. <meta
    13. content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"
    14. name="viewport">
    15. <link rel="stylesheet"
    16. href="${pageContext.request.contextPath}/plugins/bootstrap/css/bootstrap.min.css">
    17. <link rel="stylesheet"
    18. href="${pageContext.request.contextPath}/plugins/font-awesome/css/font-awesome.min.css">
    19. <link rel="stylesheet"
    20. href="${pageContext.request.contextPath}/plugins/ionicons/css/ionicons.min.css">
    21. <link rel="stylesheet"
    22. href="${pageContext.request.contextPath}/plugins/iCheck/square/blue.css">
    23. <link rel="stylesheet"
    24. href="${pageContext.request.contextPath}/plugins/morris/morris.css">
    25. <link rel="stylesheet"
    26. href="${pageContext.request.contextPath}/plugins/jvectormap/jquery-jvectormap-1.2.2.css">
    27. <link rel="stylesheet"
    28. href="${pageContext.request.contextPath}/plugins/datepicker/datepicker3.css">
    29. <link rel="stylesheet"
    30. href="${pageContext.request.contextPath}/plugins/daterangepicker/daterangepicker.css">
    31. <link rel="stylesheet"
    32. href="${pageContext.request.contextPath}/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.min.css">
    33. <link rel="stylesheet"
    34. href="${pageContext.request.contextPath}/plugins/datatables/dataTables.bootstrap.css">
    35. <link rel="stylesheet"
    36. href="${pageContext.request.contextPath}/plugins/treeTable/jquery.treetable.css">
    37. <link rel="stylesheet"
    38. href="${pageContext.request.contextPath}/plugins/treeTable/jquery.treetable.theme.default.css">
    39. <link rel="stylesheet"
    40. href="${pageContext.request.contextPath}/plugins/select2/select2.css">
    41. <link rel="stylesheet"
    42. href="${pageContext.request.contextPath}/plugins/colorpicker/bootstrap-colorpicker.min.css">
    43. <link rel="stylesheet"
    44. href="${pageContext.request.contextPath}/plugins/bootstrap-markdown/css/bootstrap-markdown.min.css">
    45. <link rel="stylesheet"
    46. href="${pageContext.request.contextPath}/plugins/adminLTE/css/AdminLTE.css">
    47. <link rel="stylesheet"
    48. href="${pageContext.request.contextPath}/plugins/adminLTE/css/skins/_all-skins.min.css">
    49. <link rel="stylesheet"
    50. href="${pageContext.request.contextPath}/css/style.css">
    51. <link rel="stylesheet"
    52. href="${pageContext.request.contextPath}/plugins/ionslider/ion.rangeSlider.css">
    53. <link rel="stylesheet"
    54. href="${pageContext.request.contextPath}/plugins/ionslider/ion.rangeSlider.skinNice.css">
    55. <link rel="stylesheet"
    56. href="${pageContext.request.contextPath}/plugins/bootstrap-slider/slider.css">
    57. <link rel="stylesheet"
    58. href="${pageContext.request.contextPath}/plugins/bootstrap-datetimepicker/bootstrap-datetimepicker.css">
    59. head>
    60. <body class="hold-transition skin-purple sidebar-mini">
    61. <div class="wrapper">
    62. <jsp:include page="header.jsp">jsp:include>
    63. <jsp:include page="aside.jsp">jsp:include>
    64. <div class="content-wrapper">
    65. <section class="content-header">
    66. <h1>
    67. 用户管理 <small>添加角色表单small>
    68. h1>
    69. <ol class="breadcrumb">
    70. <li><a href="${pageContext.request.contextPath}/index.jsp"><i
    71. class="fa fa-dashboard">i> 首页a>li>
    72. <li><a
    73. href="${pageContext.request.contextPath}/user/findAll.do">用户管理a>li>
    74. <li class="active">添加角色表单li>
    75. ol>
    76. section>
    77. <form
    78. action="${pageContext.request.contextPath}/user/addRoleToUser.do"
    79. method="post">
    80. <section class="content">
    81. <input type="hidden" name="userId" value="${user.id}">
    82. <table id="dataList"
    83. class="table table-bordered table-striped table-hover dataTable">
    84. <thead>
    85. <tr>
    86. <th class="" style="padding-right: 0px">
    87. <input id="selall"
    88. type="checkbox" class="icheckbox_square-blue">th>
    89. <th class="sorting_asc">IDth>
    90. <th class="sorting">角色名称th>
    91. <th class="sorting">角色描述th>
    92. tr>
    93. thead>
    94. <tbody>
    95. <c:forEach items="${roleList}" var="role">
    96. <tr>
    97. <td>
    98. <input name="ids" type="checkbox" value="${role.id}">
    99. td>
    100. <td>${role.id}td>
    101. <td>${role.roleName }td>
    102. <td>${role.roleDesc}td>
    103. tr>
    104. c:forEach>
    105. tbody>
    106. table>
    107. <div class="box-tools text-center">
    108. <button type="submit" class="btn bg-maroon">保存button>
    109. <button type="button" class="btn bg-default"
    110. onclick="history.back(-1);">返回button>
    111. div>
    112. section>
    113. form>
    114. div>
    115. <footer class="main-footer">
    116. <div class="pull-right hidden-xs">
    117. <b>Versionb> 1.0.8
    118. div>
    119. <strong>Copyright © 2014-2017 <a
    120. href="http://www.itcast.cn">研究院研发部a>.
    121. strong> All rights reserved. footer>
    122. div>
    123. <script
    124. src="${pageContext.request.contextPath}/plugins/jQuery/jquery-2.2.3.min.js">script>
    125. <script
    126. src="${pageContext.request.contextPath}/plugins/jQueryUI/jquery-ui.min.js">script>
    127. <script>
    128. $.widget.bridge('uibutton', $.ui.button);
    129. script>
    130. <script
    131. src="${pageContext.request.contextPath}/plugins/bootstrap/js/bootstrap.min.js">script>
    132. <script
    133. src="${pageContext.request.contextPath}/plugins/raphael/raphael-min.js">script>
    134. <script
    135. src="${pageContext.request.contextPath}/plugins/morris/morris.min.js">script>
    136. <script
    137. src="${pageContext.request.contextPath}/plugins/sparkline/jquery.sparkline.min.js">script>
    138. <script
    139. src="${pageContext.request.contextPath}/plugins/jvectormap/jquery-jvectormap-1.2.2.min.js">script>
    140. <script
    141. src="${pageContext.request.contextPath}/plugins/jvectormap/jquery-jvectormap-world-mill-en.js">script>
    142. <script
    143. src="${pageContext.request.contextPath}/plugins/knob/jquery.knob.js">script>
    144. <script
    145. src="${pageContext.request.contextPath}/plugins/daterangepicker/moment.min.js">script>
    146. <script
    147. src="${pageContext.request.contextPath}/plugins/daterangepicker/daterangepicker.js">script>
    148. <script
    149. src="${pageContext.request.contextPath}/plugins/daterangepicker/daterangepicker.zh-CN.js">script>
    150. <script
    151. src="${pageContext.request.contextPath}/plugins/datepicker/bootstrap-datepicker.js">script>
    152. <script
    153. src="${pageContext.request.contextPath}/plugins/datepicker/locales/bootstrap-datepicker.zh-CN.js">script>
    154. <script
    155. src="${pageContext.request.contextPath}/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.all.min.js">script>
    156. <script
    157. src="${pageContext.request.contextPath}/plugins/slimScroll/jquery.slimscroll.min.js">script>
    158. <script
    159. src="${pageContext.request.contextPath}/plugins/fastclick/fastclick.js">script>
    160. <script
    161. src="${pageContext.request.contextPath}/plugins/iCheck/icheck.min.js">script>
    162. <script
    163. src="${pageContext.request.contextPath}/plugins/adminLTE/js/app.min.js">script>
    164. <script
    165. src="${pageContext.request.contextPath}/plugins/treeTable/jquery.treetable.js">script>
    166. <script
    167. src="${pageContext.request.contextPath}/plugins/select2/select2.full.min.js">script>
    168. <script
    169. src="${pageContext.request.contextPath}/plugins/colorpicker/bootstrap-colorpicker.min.js">script>
    170. <script
    171. src="${pageContext.request.contextPath}/plugins/bootstrap-wysihtml5/bootstrap-wysihtml5.zh-CN.js">script>
    172. <script
    173. src="${pageContext.request.contextPath}/plugins/bootstrap-markdown/js/bootstrap-markdown.js">script>
    174. <script
    175. src="${pageContext.request.contextPath}/plugins/bootstrap-markdown/locale/bootstrap-markdown.zh.js">script>
    176. <script
    177. src="${pageContext.request.contextPath}/plugins/bootstrap-markdown/js/markdown.js">script>
    178. <script
    179. src="${pageContext.request.contextPath}/plugins/bootstrap-markdown/js/to-markdown.js">script>
    180. <script
    181. src="${pageContext.request.contextPath}/plugins/ckeditor/ckeditor.js">script>
    182. <script
    183. src="${pageContext.request.contextPath}/plugins/input-mask/jquery.inputmask.js">script>
    184. <script
    185. src="${pageContext.request.contextPath}/plugins/input-mask/jquery.inputmask.date.extensions.js">script>
    186. <script
    187. src="${pageContext.request.contextPath}/plugins/input-mask/jquery.inputmask.extensions.js">script>
    188. <script
    189. src="${pageContext.request.contextPath}/plugins/datatables/jquery.dataTables.min.js">script>
    190. <script
    191. src="${pageContext.request.contextPath}/plugins/datatables/dataTables.bootstrap.min.js">script>
    192. <script
    193. src="${pageContext.request.contextPath}/plugins/chartjs/Chart.min.js">script>
    194. <script
    195. src="${pageContext.request.contextPath}/plugins/flot/jquery.flot.min.js">script>
    196. <script
    197. src="${pageContext.request.contextPath}/plugins/flot/jquery.flot.resize.min.js">script>
    198. <script
    199. src="${pageContext.request.contextPath}/plugins/flot/jquery.flot.pie.min.js">script>
    200. <script
    201. src="${pageContext.request.contextPath}/plugins/flot/jquery.flot.categories.min.js">script>
    202. <script
    203. src="${pageContext.request.contextPath}/plugins/ionslider/ion.rangeSlider.min.js">script>
    204. <script
    205. src="${pageContext.request.contextPath}/plugins/bootstrap-slider/bootstrap-slider.js">script>
    206. <script
    207. src="${pageContext.request.contextPath}/plugins/bootstrap-datetimepicker/bootstrap-datetimepicker.min.js">script>
    208. <script>
    209. $(document).ready(function() {
    210. // 选择框
    211. $(".select2").select2();
    212. // WYSIHTML5编辑器
    213. $(".textarea").wysihtml5({
    214. locale : 'zh-CN'
    215. });
    216. // 全选操作
    217. $("#selall").click(function() {
    218. var clicks = $(this).is(':checked');
    219. if (!clicks) {
    220. $("#dataList td input[type='checkbox']").iCheck("uncheck");
    221. } else {
    222. $("#dataList td input[type='checkbox']").iCheck("check");
    223. }
    224. $(this).data("clicks", !clicks);
    225. });
    226. });
    227. // 设置激活菜单
    228. function setSidebarActive(tagUri) {
    229. var liObj = $("#" + tagUri);
    230. if (liObj.length > 0) {
    231. liObj.parent().parent().addClass("active");
    232. liObj.addClass("active");
    233. }
    234. }
    235. script>
    236. body>
    237. html>
    6.1.2.UserController
    fifindUserByIdAndAllRole(Long id) 方法
    此方法用于查找要操作的用户及可以添加的角色,参数是要操作的用户 id
    1. @RequestMapping("/findUserByIdAndAllRole.do")
    2. public ModelAndView findUserByIdAndAllRole(Long id) throws Exception {
    3. UserInfo user = userService.findById(id);
    4. List roleList = roleService.findOtherRole(id);
    5. ModelAndView mv = new ModelAndView();
    6. mv.addObject("user", user);
    7. mv.addObject("roleList", roleList);
    8. mv.setViewName("user-role-add");
    9. return mv;
    10. }
    调用 IUserService fifindById 方法获取要操作的 User
    调用 IRoleService fifindOtherRole 方法用于获取可以添加的角色信息
    addRoleToUser(Long userId,Long[] ids) 方法些方法用于在用户与角色之间建立关系,参数userId 代表要操作的用户 id, 参数 ids 代表的是角色 id 数组
    1. @RequestMapping("/addRoleToUser.do")
    2. public String addRoleToUser(Long userId, Long[] ids) throws Exception {
    3. userService.addRoleToUser(userId,ids);
    4. return "redirect:findAll.do";
    5. }
    6.1.3.Dao
    IRoleDao
    1. @Select("select * from role where id not in( select roleId from user_role where userId=#
    2. {id})")
    3. public List<Role> findOtherRole(Long id);
    用于查找可以添加的角色
    IUserDao
    1. @Insert("insert into user_role(userId,roleId) value(#{userId},#{roleId})")
    2. public void addRoleToUser(@Param("userId") Long userId, @Param("roleId") Long roleId);
    用于添加用户与角色关系
    6.2 角色权限关联
    角色与权限之间是多对多关系,我们要建立它们之间的关系,只需要在中间表 role_permission 插入数据即可。
    6.2.1. 角色权限关联相关页面
    role-list.jsp 页面上添加链接
    1. <a href="${pageContext.request.contextPath}/role/findRoleByIdAndAllPermission.do?
    2. id=${role.id}" class="btn bg-olive btn-xs">添加权限a>
    展示可以添加权限的页面 role-permission-add.jsp
    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    4. html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    5. <html>
    6. <head>
    7. <meta charset="utf-8">
    8. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    9. <title>数据 - AdminLTE2定制版title>
    10. <meta name="description" content="AdminLTE2定制版">
    11. <meta name="keywords" content="AdminLTE2定制版">
    12. <meta
    13. content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"
    14. name="viewport">
    15. <link rel="stylesheet"
    16. href="${pageContext.request.contextPath}/plugins/bootstrap/css/bootstrap.min.css">
    17. <link rel="stylesheet"
    18. href="${pageContext.request.contextPath}/plugins/font-awesome/css/font-awesome.min.css">
    19. <link rel="stylesheet"
    20. href="${pageContext.request.contextPath}/plugins/ionicons/css/ionicons.min.css">
    21. <link rel="stylesheet"
    22. href="${pageContext.request.contextPath}/plugins/iCheck/square/blue.css">
    23. <link rel="stylesheet"
    24. href="${pageContext.request.contextPath}/plugins/morris/morris.css">
    25. <link rel="stylesheet"
    26. href="${pageContext.request.contextPath}/plugins/jvectormap/jquery-jvectormap-1.2.2.css">
    27. <link rel="stylesheet"
    28. href="${pageContext.request.contextPath}/plugins/datepicker/datepicker3.css">
    29. <link rel="stylesheet"
    30. href="${pageContext.request.contextPath}/plugins/daterangepicker/daterangepicker.css">
    31. <link rel="stylesheet"
    32. href="${pageContext.request.contextPath}/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.min.css">
    33. <link rel="stylesheet"
    34. href="${pageContext.request.contextPath}/plugins/datatables/dataTables.bootstrap.css">
    35. <link rel="stylesheet"
    36. href="${pageContext.request.contextPath}/plugins/treeTable/jquery.treetable.css">
    37. <link rel="stylesheet"
    38. href="${pageContext.request.contextPath}/plugins/treeTable/jquery.treetable.theme.default.css">
    39. <link rel="stylesheet"
    40. href="${pageContext.request.contextPath}/plugins/select2/select2.css">
    41. <link rel="stylesheet"
    42. href="${pageContext.request.contextPath}/plugins/colorpicker/bootstrap-colorpicker.min.css">
    43. <link rel="stylesheet"
    44. href="${pageContext.request.contextPath}/plugins/bootstrap-markdown/css/bootstrap-markdown.min.css">
    45. <link rel="stylesheet"
    46. href="${pageContext.request.contextPath}/plugins/adminLTE/css/AdminLTE.css">
    47. <link rel="stylesheet"
    48. href="${pageContext.request.contextPath}/plugins/adminLTE/css/skins/_all-skins.min.css">
    49. <link rel="stylesheet"
    50. href="${pageContext.request.contextPath}/css/style.css">
    51. <link rel="stylesheet"
    52. href="${pageContext.request.contextPath}/plugins/ionslider/ion.rangeSlider.css">
    53. <link rel="stylesheet"
    54. href="${pageContext.request.contextPath}/plugins/ionslider/ion.rangeSlider.skinNice.css">
    55. <link rel="stylesheet"
    56. href="${pageContext.request.contextPath}/plugins/bootstrap-slider/slider.css">
    57. <link rel="stylesheet"
    58. href="${pageContext.request.contextPath}/plugins/bootstrap-datetimepicker/bootstrap-datetimepicker.css">
    59. head>
    60. <body class="hold-transition skin-purple sidebar-mini">
    61. <div class="wrapper">
    62. <jsp:include page="header.jsp">jsp:include>
    63. <jsp:include page="aside.jsp">jsp:include>
    64. <div class="content-wrapper">
    65. <section class="content-header">
    66. <h1>
    67. 角色管理 <small>添加权限表单small>
    68. h1>
    69. <ol class="breadcrumb">
    70. <li><a href="${pageContext.request.contextPath}/index.jsp"><i
    71. class="fa fa-dashboard">i> 首页a>li>
    72. <li><a
    73. href="${pageContext.request.contextPath}/role/findAll.do">角色管理a>li>
    74. <li class="active">添加权限表单li>
    75. ol>
    76. section>
    77. <form
    78. action="${pageContext.request.contextPath}/role/addPermissionToRole.do"
    79. method="post">
    80. <section class="content">
    81. <input type="hidden" name="roleId" value="${role.id}">
    82. <table id="dataList"
    83. class="table table-bordered table-striped table-hover dataTable">
    84. <thead>
    85. <tr>
    86. <th class="" style="padding-right: 0px">
    87. <input id="selall"
    88. type="checkbox" class="icheckbox_square-blue">th>
    89. <th class="sorting_asc">IDth>
    90. <th class="sorting">权限名称th>
    91. <th class="sorting">权限URLth>
    92. tr>
    93. thead>
    94. <tbody>
    95. <c:forEach items="${permissionList}" var="permission">
    96. <tr>
    97. <td>
    98. <input name="ids" type="checkbox" value="${permission.id}">
    99. td>
    100. <td>${permission.id}td>
    101. <td>${permission.permissionName }td>
    102. <td>${permission.url}td>
    103. tr>
    104. c:forEach>
    105. tbody>
    106. table>
    107. <div class="box-tools text-center">
    108. <button type="submit" class="btn bg-maroon">保存button>
    109. <button type="button" class="btn bg-default"
    110. onclick="history.back(-1);">返回button>
    111. div>
    112. section>
    113. form>
    114. div>
    115. <footer class="main-footer">
    116. <div class="pull-right hidden-xs">
    117. <b>Versionb> 1.0.8
    118. div>
    119. <strong>Copyright © 2014-2017 <a
    120. href="http://www.itcast.cn">研究院研发部a>.
    121. strong> All rights reserved. footer>
    122. div>
    123. <script
    124. src="${pageContext.request.contextPath}/plugins/jQuery/jquery-2.2.3.min.js">script>
    125. <script
    126. src="${pageContext.request.contextPath}/plugins/jQueryUI/jquery-ui.min.js">script>
    127. <script>
    128. $.widget.bridge('uibutton', $.ui.button);
    129. script>
    130. <script
    131. src="${pageContext.request.contextPath}/plugins/bootstrap/js/bootstrap.min.js">script>
    132. <script
    133. src="${pageContext.request.contextPath}/plugins/raphael/raphael-min.js">script>
    134. <script
    135. src="${pageContext.request.contextPath}/plugins/morris/morris.min.js">script>
    136. <script
    137. src="${pageContext.request.contextPath}/plugins/sparkline/jquery.sparkline.min.js">script>
    138. <script
    139. src="${pageContext.request.contextPath}/plugins/jvectormap/jquery-jvectormap-1.2.2.min.js">script>
    140. <script
    141. src="${pageContext.request.contextPath}/plugins/jvectormap/jquery-jvectormap-world-mill-en.js">script>
    142. <script
    143. src="${pageContext.request.contextPath}/plugins/knob/jquery.knob.js">script>
    144. <script
    145. src="${pageContext.request.contextPath}/plugins/daterangepicker/moment.min.js">script>
    146. <script
    147. src="${pageContext.request.contextPath}/plugins/daterangepicker/daterangepicker.js">script>
    148. <script
    149. src="${pageContext.request.contextPath}/plugins/daterangepicker/daterangepicker.zh-CN.js">script>
    150. <script
    151. src="${pageContext.request.contextPath}/plugins/datepicker/bootstrap-datepicker.js">script>
    152. <script
    153. src="${pageContext.request.contextPath}/plugins/datepicker/locales/bootstrap-datepicker.zh-CN.js">script>
    154. <script
    155. src="${pageContext.request.contextPath}/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.all.min.js">script>
    156. <script
    157. src="${pageContext.request.contextPath}/plugins/slimScroll/jquery.slimscroll.min.js">script>
    158. <script
    159. src="${pageContext.request.contextPath}/plugins/fastclick/fastclick.js">script>
    160. <script
    161. src="${pageContext.request.contextPath}/plugins/iCheck/icheck.min.js">script>
    162. <script
    163. src="${pageContext.request.contextPath}/plugins/adminLTE/js/app.min.js">script>
    164. <script
    165. src="${pageContext.request.contextPath}/plugins/treeTable/jquery.treetable.js">script>
    166. <script
    167. src="${pageContext.request.contextPath}/plugins/select2/select2.full.min.js">script>
    168. <script
    169. src="${pageContext.request.contextPath}/plugins/colorpicker/bootstrap-colorpicker.min.js">script>
    170. <script
    171. src="${pageContext.request.contextPath}/plugins/bootstrap-wysihtml5/bootstrap-wysihtml5.zh-CN.js">script>
    172. <script
    173. src="${pageContext.request.contextPath}/plugins/bootstrap-markdown/js/bootstrap-markdown.js">script>
    174. <script
    175. src="${pageContext.request.contextPath}/plugins/bootstrap-markdown/locale/bootstrap-markdown.zh.js">script>
    176. <script
    177. src="${pageContext.request.contextPath}/plugins/bootstrap-markdown/js/markdown.js">script>
    178. <script
    179. src="${pageContext.request.contextPath}/plugins/bootstrap-markdown/js/to-markdown.js">script>
    180. <script
    181. src="${pageContext.request.contextPath}/plugins/ckeditor/ckeditor.js">script>
    182. <script
    183. src="${pageContext.request.contextPath}/plugins/input-mask/jquery.inputmask.js">script>
    184. <script
    185. src="${pageContext.request.contextPath}/plugins/input-mask/jquery.inputmask.date.extensions.js">script>
    186. <script
    187. src="${pageContext.request.contextPath}/plugins/input-mask/jquery.inputmask.extensions.js">script>
    188. <script
    189. src="${pageContext.request.contextPath}/plugins/datatables/jquery.dataTables.min.js">script>
    190. <script
    191. src="${pageContext.request.contextPath}/plugins/datatables/dataTables.bootstrap.min.js">script>
    192. <script
    193. src="${pageContext.request.contextPath}/plugins/chartjs/Chart.min.js">script>
    194. <script
    195. src="${pageContext.request.contextPath}/plugins/flot/jquery.flot.min.js">script>
    196. <script
    197. src="${pageContext.request.contextPath}/plugins/flot/jquery.flot.resize.min.js">script>
    198. <script
    199. src="${pageContext.request.contextPath}/plugins/flot/jquery.flot.pie.min.js">script>
    200. <script
    201. src="${pageContext.request.contextPath}/plugins/flot/jquery.flot.categories.min.js">script>
    202. <script
    203. src="${pageContext.request.contextPath}/plugins/ionslider/ion.rangeSlider.min.js">script>
    204. <script
    205. src="${pageContext.request.contextPath}/plugins/bootstrap-slider/bootstrap-slider.js">script>
    206. <script
    207. src="${pageContext.request.contextPath}/plugins/bootstrap-datetimepicker/bootstrap-datetimepicker.min.js">script>
    208. <script>
    209. $(document).ready(function() {
    210. // 选择框
    211. $(".select2").select2();
    212. // WYSIHTML5编辑器
    213. $(".textarea").wysihtml5({
    214. locale : 'zh-CN'
    215. });
    216. // 全选操作
    217. $("#selall").click(function() {
    218. var clicks = $(this).is(':checked');
    219. if (!clicks) {
    220. $("#dataList td input[type='checkbox']").iCheck("uncheck");
    221. } else {
    222. $("#dataList td input[type='checkbox']").iCheck("check");
    223. }
    224. $(this).data("clicks", !clicks);
    225. });
    226. });
    227. // 设置激活菜单
    228. function setSidebarActive(tagUri) {
    229. var liObj = $("#" + tagUri);
    230. if (liObj.length > 0) {
    231. liObj.parent().parent().addClass("active");
    232. liObj.addClass("active");
    233. }
    234. }
    235. script>
    236. body>
    237. html>
    6.2.2.RoleController
    fifindRoleByIdAndAllPermission(Long roleId) 方法
    此方法用于查找要操作的角色及可以添加的权限,参数是要操作的角色 id
    1. @RequestMapping("/findRoleByIdAndAllPermission.do")
    2. public ModelAndView findRoleByIdAndAllPermission(@RequestParam(name = "id", required
    3. = true) Long roleid)
    4. throws Exception {
    5. ModelAndView mv = new ModelAndView();
    6. Role role = roleService.findById(roleid);
    7. mv.addObject("role", role);
    8. List permissionList =
    9. permissionService.findOtherPermission(roleid);
    10. mv.addObject("permissionList", permissionList);
    11. mv.setViewName("role-permission-add");
    12. return mv;
    13. }
    调用 IRoleService fifindById 方法获取要操作的 Role
    调用 IPermissionService fifindOtherPermission 方法用于获取可以添加的权限信息
    addPermissionToRole(Long roleId,Long[] ids) 方法
    些方法用于在角色与权限之间建立关系,参数 roleId 代表要操作的角色 id, 参数 permissionIds 代表的是权限 id数组
    1. @RequestMapping("/addPermissionToRole.do")
    2. public String addPermissionToRole(@RequestParam(name = "roleId") Long roleId,
    3. @RequestParam(name = "ids") Long[] permissionIds) throws Exception {
    4. roleService.addPermissionToRole(roleId, permissionIds);
    5. return "redirect:findAll.do";
    6. }
    6.2.3.Dao
    IPermissionDao
    1. @Select("select * from permission where id not in (select permissionId from role_permission
    2. where roleId=#{roleId})")
    3. public List<Permission> findOtherPermission(Long roleid);
    用于查找可以添加的权限
    IRoleDao
    1. @Insert("insert into role_permission (roleId,permissionId) value (#{roleId},#
    2. {permissionId})")
    3. public void addPermissionToRole(@Param("roleId") Long roleId, @Param("permissionId") Long
    4. permissionId);
    用于绑定角色与权限的关系
    6.3 服务器端方法级权限控制
    在服务器端我们可以通过 Spring security 提供的注解对方法来进行权限控制。 Spring Security 在方法的权限控制上支持三种类型的注解,JSR-250 注解、 @Secured 注解和支持表达式的注解,这三种注解默认都是没有启用的,需要单独通过global-method-security 元素的对应属性进行启用
    6.3.1. 开启注解使用
    配置文件
    "enabled" />
    "enabled" />
    "disabled" />
    注解开启
    @EnableGlobalMethodSecurity Spring Security 默认是禁用注解的,要想开启注解,需要在继承
    WebSecurityConfifigurerAdapter 的类上加 @EnableGlobalMethodSecurity 注解,并在该类中将
    AuthenticationManager 定义为 Bean
    6.3.2.JSR-250 注解
    @RolesAllowed 表示访问对应方法时所应该具有的角色
    示例:
    @RolesAllowed({"USER", "ADMIN"}) 该方法只要具有 "USER", "ADMIN" 任意一种权限就可以访问。这里可以省略前缀ROLE_ ,实际的权限可能是 ROLE_ADMIN
    @PermitAll 表示允许所有的角色进行访问,也就是说不进行权限控制
    @DenyAll 是和 PermitAll 相反的,表示无论什么角色都不能访问
    6.3.3. 支持表达式的注解
    @PreAuthorize 在方法调用之前 , 基于表达式的计算结果来限制对方法的访问
    示例:
    @PreAuthorize("#userId == authentication.principal.userId or hasAuthority(‘ADMIN’)")
    void changePassword(@P("userId") long userId ){ }
    这里表示在 changePassword 方法执行之前,判断方法参数 userId 的值是否等于 principal 中保存的当前用户的
    userId ,或者当前用户是否具有 ROLE_ADMIN 权限,两种符合其一,就可以访问该方法。

     @PostAuthorize 允许方法调用,但是如果表达式计算结果为false,将抛出一个安全性异常

    示例:
    @PostAuthorize
    User getUser("returnObject.userId == authentication.principal.userId or
    hasPermission(returnObject, 'ADMIN')");
    @PostFilter 允许方法调用 , 但必须按照表达式来过滤方法的结果
    @PreFilter 允许方法调用 , 但必须在进入方法之前过滤输入值
    6.3.4.@Secured 注解
    @Secured 注解标注的方法进行权限控制的支持,其值默认为 disabled
    示例:
    @Secured("IS_AUTHENTICATED_ANONYMOUSLY")
    public Account readAccount(Long id);
    @Secured("ROLE_TELLER")

    6.4 页面端标签控制权限
    jsp 页面中我们可以使用 spring security 提供的权限标签来进行权限控制
    6.4.1. 导入
    maven 导入
    1. <dependency>
    2. <groupId>org.springframework.securitygroupId>
    3. <artifactId>spring-security-taglibsartifactId>
    4. <version>versionversion>
    5. dependency>
    页面导入
    <%@taglib uri="http://www.springframework.org/security/tags" prefix="security"%>
    6.4.2. 常用标签
    jsp 中我们可以使用以下三种标签,其中 authentication 代表的是当前认证对象,可以获取当前认证对象信息,例如用户名。其它两个标签我们可以用于权限控制
    6.4.2.1 authentication
    <security:authentication property="" htmlEscape="" scope="" var=""/>
    property : 只允许指定 Authentication 所拥有的属性,可以进行属性的级联获取,如 “principle.username” ,不允许直接通过方法进行调用htmlEscape:表示是否需要将 html 进行转义。默认为 true
    scope :与 var 属性一起使用,用于指定存放获取的结果的属性名的作用范围,默认我 pageContext Jsp 中拥有的作用范围都进行进行指定
    var : 用于指定一个属性名,这样当获取到了 authentication 的相关信息后会将其以 var 指定的属性名进行存放,默认是存放在pageConext
    6.4.2.2 authorize
    authorize 是用来判断普通权限的,通过判断用户是否具有对应的权限而控制其所包含内容的显示
    <security:authorize access="" method="" url="" var="">security:authorize>
    access : 需要使用表达式来判断权限,当表达式的返回结果为 true 时表示拥有对应的权限
    method method 属性是配合 url 属性一起使用的,表示用户应当具有指定 url 指定 method 访问的权限,method的默认值为 GET ,可选值为 http 请求的 7 种方法
    url url 表示如果用户拥有访问指定 url 的权限即表示可以显示 authorize 标签包含的内容
    var :用于指定将权限鉴定的结果存放在 pageContext 的哪个属性中
    6.4.2.3 accesscontrollist
    accesscontrollist 标签是用于鉴定 ACL 权限的。其一共定义了三个属性: hasPermission domainObject var , 其中前两个是必须指定的
    <security:accesscontrollist hasPermission="" domainObject="" var="">security:accesscontrollist>
    hasPermission hasPermission 属性用于指定以逗号分隔的权限列表
    domainObject domainObject 用于指定对应的域对象
    var var 则是用以将鉴定的结果以指定的属性名存入 pageContext 中,以供同一页面的其它地方使用
  • 相关阅读:
    Java中HashMap之replaceAll()方法具有什么功能呢?
    前序中序、中序后序以及前序后序构造二叉树
    关于测试的思考-测试驱动开发
    Leetcode 754. 到达终点数字
    mysql.help_topic:join后面on居然还可以用 < 连接实现列转行
    银行数据中心绿色发展新格局:建设全闪数据中心
    继承(六)—— 菱形继承的问题以及解决方案(初识虚基表)
    全球化浪潮下的技术与安全
    支持向量机
    C# IO Stream 流(二)扩展类_封装器
  • 原文地址:https://blog.csdn.net/gaosong0623/article/details/127639129