使用Spring Security实现权限管理

SpringSecurity-用户认证-设置用户名密码 SpringSecurity-用户认证-设置用户名密码,以及实现数据库认证来完成用户登录 阅读详情

 

 

使用Spring Security实现权限管理

 

1、技术目标

 

 

  • 了解并创建Security框架所需数据表
  • 为项目添加Spring Security框架
  • 掌握Security框架配置
  • 应用Security框架为项目的CRUD操作绑定权限

 

 

注意:本文所用项目为"影片管理",参看

http://hotstrong.iteye.com/blog/1156785

 

2、权限管理需求描述

 

  • 为系统中的每个操作定义权限,如定义4个权限:
     1)超级权限,可以使用所有操作
     2)添加影片权限
     3)修改影片权限
     4)删除影片权限
  • 为系统设置管理员帐号、密码
  • 为系统创建权限组,每个权限组可以配置多个操作权限,如创建2个权限组:
     1)"Administrator"权限组,具有超级权限
     2)"影片维护"权限组,具有添加影片、修改影片权限
  • 可将管理员加入权限组,管理员登录后具备权限组所对应操作权限
  • 管理员可不属于某权限组,可为管理员直接分配权限

 

 

3、使用准备

 

3.1)在数据库中创建6张表

 

t_admin        管理员帐号表

t_role权限表

t_group        权限组表

t_group_role权限组对应权限表

t_group_user管理员所属权限组表

t_user_role管理员对应权限表

 

建表SQL语句如下:

 

 

Sql代码   收藏代码
  1. SET FOREIGN_KEY_CHECKS=0;  
  2.     ------------------------------  
  3.     -- 创建管理员帐号表t_admin  
  4.     -- ----------------------------  
  5.     CREATE TABLE `t_admin` (  
  6.       `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,  
  7.       `passwd` varchar(12) NOT NULL DEFAULT '' COMMENT '用户密码',  
  8.       `nickname` varchar(20) NOT NULL DEFAULT '' COMMENT '用户名字',  
  9.       `phoneno` varchar(32) NOT NULL DEFAULT '' COMMENT '电话号码',  
  10.       PRIMARY KEY (`id`)  
  11.     ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;  
  12.   
  13.     -- ----------------------------  
  14.     -- 添加3个管理帐号   
  15.     -- ----------------------------  
  16.     INSERT INTO `t_admin` VALUES ('1', 'admin', 'admin', '');  
  17.     INSERT INTO `t_admin` VALUES ('4', '123456', 'test', '');  
  18.     INSERT INTO `t_admin` VALUES ('5', '111111', '111111', '');  
  19.       
  20.     -- ----------------------------  
  21.     -- 创建权限表t_role  
  22.     -- ----------------------------  
  23.     CREATE TABLE `t_role` (  
  24.       `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,  
  25.       `role` varchar(40) NOT NULL DEFAULT '',  
  26.       `descpt` varchar(40) NOT NULL DEFAULT '' COMMENT '角色描述',  
  27.       `category` varchar(40) NOT NULL DEFAULT '' COMMENT '分类',  
  28.       PRIMARY KEY (`id`)  
  29.     ) ENGINE=InnoDB AUTO_INCREMENT=60 DEFAULT CHARSET=utf8;  
  30.   
  31.     -- ----------------------------  
  32.     -- 加入4个操作权限  
  33.     -- ----------------------------  
  34.     INSERT INTO `t_role` VALUES ('1', 'ROLE_ADMIN', '系统管理员', '系统管理员');  
  35.     INSERT INTO `t_role` VALUES ('2', 'ROLE_UPDATE_FILM', '修改', '影片管理');  
  36.     INSERT INTO `t_role` VALUES ('3', 'ROLE_DELETE_FILM', '删除', '影片管理');  
  37.     INSERT INTO `t_role` VALUES ('4', 'ROLE_ADD_FILM', '添加', '影片管理');  
  38.   
  39.     -- ----------------------------  
  40.     -- 创建权限组表  
  41.     -- ----------------------------  
  42.     CREATE TABLE `t_group` (  
  43.       `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,  
  44.       `groupname` varchar(50) NOT NULL DEFAULT '',  
  45.       PRIMARY KEY (`id`)  
  46.     ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;  
  47.   
  48.     -- ----------------------------  
  49.     -- 添加2个权限组  
  50.     -- ----------------------------  
  51.     INSERT INTO `t_group` VALUES ('1', 'Administrator');  
  52.     INSERT INTO `t_group` VALUES ('2', '影片维护');  
  53.   
  54.     -- ----------------------------  
  55.     -- 创建权限组对应权限表t_group_role  
  56.     -- ----------------------------  
  57.     CREATE TABLE `t_group_role` (  
  58.       `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,  
  59.       `groupid` bigint(20) unsigned NOT NULL,  
  60.       `roleid` bigint(20) unsigned NOT NULL,  
  61.       PRIMARY KEY (`id`),  
  62.       UNIQUE KEY `groupid2` (`groupid`,`roleid`),  
  63.       KEY `roleid` (`roleid`),  
  64.       CONSTRAINT `t_group_role_ibfk_1` FOREIGN KEY (`groupid`) REFERENCES `t_group` (`id`),  
  65.       CONSTRAINT `t_group_role_ibfk_2` FOREIGN KEY (`roleid`) REFERENCES `t_role` (`id`)  
  66.     ) ENGINE=InnoDB AUTO_INCREMENT=83 DEFAULT CHARSET=utf8;  
  67.   
  68.     -- ----------------------------  
  69.     -- 加入权限组与权限的对应关系  
  70.     -- ----------------------------  
  71.     INSERT INTO `t_group_role` VALUES ('1', '1', '1');  
  72.     INSERT INTO `t_group_role` VALUES ('2', '2', '2');  
  73.     INSERT INTO `t_group_role` VALUES ('4', '2', '4');  
  74.   
  75.     -- ----------------------------  
  76.     -- 创建管理员所属权限组表t_group_user  
  77.     -- ----------------------------  
  78.     CREATE TABLE `t_group_user` (  
  79.       `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,  
  80.       `userid` bigint(20) unsigned NOT NULL,  
  81.       `groupid` bigint(20) unsigned NOT NULL,  
  82.       PRIMARY KEY (`id`),  
  83.       KEY `userid` (`userid`),  
  84.       KEY `groupid` (`groupid`),  
  85.       CONSTRAINT `t_group_user_ibfk_2` FOREIGN KEY (`groupid`) REFERENCES `t_group` (`id`),  
  86.       CONSTRAINT `t_group_user_ibfk_3` FOREIGN KEY (`userid`) REFERENCES `t_admin` (`id`)  
  87.     ) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8;  
  88.   
  89.     -- ----------------------------  
  90.     -- 将管理员加入权限组  
  91.     -- ----------------------------  
  92.     INSERT INTO `t_group_user` VALUES ('1', '1', '1');  
  93.     INSERT INTO `t_group_user` VALUES ('2', '4', '2');  
  94.   
  95.     -- ----------------------------  
  96.     -- 创建管理员对应权限表t_user_role  
  97.     -- 设置该表可跳过权限组,为管理员直接分配权限  
  98.     -- ----------------------------  
  99.     CREATE TABLE `t_user_role` (  
  100.       `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,  
  101.       `userid` bigint(20) unsigned NOT NULL,  
  102.       `roleid` bigint(20) unsigned NOT NULL,  
  103.       PRIMARY KEY (`id`),  
  104.       KEY `userid` (`userid`),  
  105.       KEY `roleid` (`roleid`),  
  106.       CONSTRAINT `t_user_role_ibfk_1` FOREIGN KEY (`userid`) REFERENCES `t_admin` (`id`),  
  107.       CONSTRAINT `t_user_role_ibfk_2` FOREIGN KEY (`roleid`) REFERENCES `t_role` (`id`)  
  108.     ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;  
  109.       

 

3.2)在项目中新增如下jar包(security框架所需jar包):

 

    注意:以下jar包本文已提供下载

 

spring-security-config-3.1.0.RC2.jar

spring-security-core-3.1.0.RC2.jar

spring-security-taglibs-3.1.0.RC2.jar

spring-security-web-3.1.0.RC2.jar

 

3.3)创建如下包,放置登录验证过滤器代码:

 

com.xxx.security

 

3.4)在src下创建Spring配置文件applicationContext-security.xml,内容如下:

 

 

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3.     <beans:beans xmlns="http://www.springframework.org/schema/security"  
  4.         xmlns:b="http://www.springframework.org/schema/beans" xmlns:beans="http://www.springframework.org/schema/beans"  
  5.         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  6.         xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
  7.                             http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd">  
  8.       
  9.     <!-- 这里进行配置 -->  
  10.       
  11. </beans:beans>  

 

3.5)在web.xml中加入security配置,如下:

 

 

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.     <web-app version="2.5"   
  3.         xmlns="http://java.sun.com/xml/ns/javaee"   
  4.         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  5.         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
  6.         http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
  7.       <welcome-file-list>  
  8.         <welcome-file>index.jsp</welcome-file>  
  9.       </welcome-file-list>  
  10.         
  11.         <context-param>  
  12.             <param-name>contextConfigLocation</param-name>  
  13.             <param-value>/WEB-INF/applicationContext-*.xml,classpath*:applicationContext-*.xml</param-value>  
  14.         </context-param>  
  15.           
  16.         <!-- 配置Spring Security -->  
  17.         <filter>  
  18.             <filter-name>springSecurityFilterChain</filter-name>  
  19.             <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>  
  20.         </filter>  
  21.         <filter-mapping>  
  22.             <filter-name>springSecurityFilterChain</filter-name>  
  23.             <url-pattern>/*</url-pattern>  
  24.         </filter-mapping>  
  25.           
  26.         <filter>  
  27.             <filter-name>struts2</filter-name>  
  28.             <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>  
  29.         </filter>  
  30.         <filter-mapping>  
  31.             <filter-name>struts2</filter-name>  
  32.             <url-pattern>/*</url-pattern>  
  33.         </filter-mapping>  
  34.         <listener>  
  35.             <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  36.         </listener>  
  37.     </web-app>  

 

 

4、站点根路径下创建登录页面login.jsp,代码如下:

 

 

Html代码   收藏代码
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  2.     pageEncoding="UTF-8"%>  
  3. <%@ taglib prefix="s" uri="/struts-tags"%>  
  4. <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>  
  5. <%   
  6. String path = request.getContextPath();  
  7. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path;   
  8. %>  
  9. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  10. <html xmlns="http://www.w3.org/1999/xhtml">  
  11. <head>  
  12. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
  13. <title>后台登录</title>  
  14. </head>  
  15. <body onload="document.loginForm.j_username.focus();">  
  16.     <!-- 登录表单 -->  
  17.     <form name="loginForm" action="<c:url value='/j_spring_security_check'/>" method="post">  
  18.         <!-- 登录失败后,显示之前的登录名 -->  
  19.         用户名:<input type='text' name='j_username' class="txtinput"  
  20.         value='<c:if test="${not empty param.login_error}" >  
  21.         <c:out value="${SPRING_SECURITY_LAST_USERNAME}"/></c:if>' />  
  22.         <br />  
  23.         密码:<input type='password' name='j_password' class="txtinput" />  
  24.         <br />  
  25.           
  26.         <input type="checkbox" name="_spring_security_remember_me" />  
  27.         &nbsp;保存登录信息  
  28.         <input name="submit" type="submit" value="提交" />  
  29.         <input name="reset" type="reset" value="重置" />  
  30.           
  31.     </form>  
  32.     <br />  
  33.     <!-- 显示登录失败原因 -->  
  34.     <c:if test="${not empty param.error}">  
  35.         <font color="red"> 登录失败<br />  
  36.         <br />  
  37.         原因: <c:out value="${SPRING_SECURITY_LAST_EXCEPTION.message}" />. </font>  
  38.     </c:if>  
  39. </body>  
  40. </html>  

 

 

5、站点根路径下创建注销页面loggedout.jsp,代码如下:

 

 

Html代码   收藏代码
  1. <%@page session="false" %>  
  2. <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>  
  3. <%@ page pageEncoding="UTF-8"%>  
  4. <%   
  5. String path = request.getContextPath();  
  6. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path;   
  7. %>  
  8. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  9. <html xmlns="http://www.w3.org/1999/xhtml">  
  10.   <head>  
  11.       <meta http-equiv="content-type" content="text/html; charset=UTF-8" />  
  12.       <title>登出</title>  
  13.   </head>  
  14. <body>  
  15. 你已经退出。   
  16. <a href="<c:url value='/login.jsp'/>">点击这里登录</a>  
  17. </body>  
  18. </html>  

 

 

6、站点根路径下创建HttpSession超时提示页面timeout.jsp,代码如下:

 

 

Html代码   收藏代码
  1. <%@page session="false" %>  
  2. <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>  
  3. <%@ page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>  
  4. <%  
  5. String path = request.getContextPath();  
  6. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path;   
  7. %>  
  8. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  9. <html xmlns="http://www.w3.org/1999/xhtml">  
  10.   <head>  
  11.       <title>用户失效</title>  
  12.   </head>  
  13. <body>  
  14. 你的登录已经失效,请重新登录。   
  15. <br />  
  16. <a href="<c:url value='/login.jsp'/>" >  
  17. 点击这里登录</a>  
  18. </body>  
  19. </html>  

 

 

7、在com.xxx.security包下创建登录验证过滤器,该过滤器可用于在管理员登录时进行日志记录等相关操作,包括两个类:

 

 

  • LoginUsernamePasswordAuthenticationFilter
  • LoginSuccessHandler

 

7.1)LoginUsernamePasswordAuthenticationFilter代码如下:

 

 

Java代码   收藏代码
  1. package com.xxx.security;  
  2. import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;  
  3.   
  4. public class LoginUsernamePasswordAuthenticationFilter extends  
  5.         UsernamePasswordAuthenticationFilter {  
  6.       
  7. }  

 

7.2)LoginSuccessHandler代码如下:

 

 

Java代码   收藏代码
  1. package com.xxx.security;  
  2.   
  3. import java.io.IOException;  
  4. import javax.servlet.ServletException;  
  5. import javax.servlet.http.HttpServletRequest;  
  6. import javax.servlet.http.HttpServletResponse;  
  7. import org.springframework.security.core.Authentication;  
  8. import org.springframework.security.core.userdetails.UserDetails;  
  9. import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;  
  10.   
  11. /** 
  12.  * 处理管理员登录日志 
  13.  * 
  14.  */  
  15. public class LoginSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler{  
  16.       
  17.     @Override  
  18.     public void onAuthenticationSuccess(HttpServletRequest request,  
  19.             HttpServletResponse response, Authentication authentication) throws IOException,  
  20.             ServletException {  
  21.           
  22.         UserDetails userDetails = (UserDetails)authentication.getPrincipal();  
  23.           
  24.         //输出登录提示信息  
  25.         System.out.println("管理员 " + userDetails.getUsername() + " 登录");  
  26.               
  27.         super.onAuthenticationSuccess(request, response, authentication);  
  28.     }  
  29.       
  30. }  

 

 

8、在applicationContext-security.xml中加入权限管理配置,如下:

 

 

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <beans:beans xmlns="http://www.springframework.org/schema/security"  
  4.     xmlns:b="http://www.springframework.org/schema/beans" xmlns:beans="http://www.springframework.org/schema/beans"  
  5.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  6.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
  7.                         http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd">  
  8.   
  9.     <http >  
  10.         <!-- 不拦截login.jsp -->  
  11.         <intercept-url pattern="/login.jsp*" access="IS_AUTHENTICATED_ANONYMOUSLY" />  
  12.         <!--仅拦截到manager下面的内容,具备access对应权限的-->  
  13.         <intercept-url pattern="/manager/**" access="ROLE_ADMIN,ROLE_UPDATE_FILM,ROLE_DELETE_FILM,ROLE_ADD_FILM" />  
  14.         <!-- 设置登录过滤器 -->  
  15.         <custom-filter before="FORM_LOGIN_FILTER" ref="authenticationProcessingFilter" />  
  16.         <!-- 登录表单设置 -->  
  17.         <form-login login-page="/login.jsp"  
  18.             default-target-url="/manager/films.jsp"  
  19.             authentication-failure-url="/login.jsp?error=true" />  
  20.           
  21.         <!-- 登出操作后跳转到该页面 -->  
  22.         <logout logout-success-url="/loggedout.jsp"  
  23.             delete-cookies="JSESSIONID" />  
  24.         <remember-me />  
  25.           
  26.         <!-- SESSION超时后跳转到该页面 -->  
  27.         <session-management invalid-session-url="/timeout.jsp">  
  28.         </session-management>  
  29.     </http>  
  30.       
  31.     <authentication-manager alias="authenticationManager">  
  32.         <authentication-provider>  
  33.             <!--   
  34.                 直接使用SQL语句查询登录帐号对应权限,  
  35.                 users-by-username-query:查询登录用户是否存在  
  36.                 authorities-by-username-query:查询登录用户权限(登录用户可以不属于任何组,从t_user_role表中获取权限)  
  37.                 group-authorities-by-username-query:查询登录用户所在组的权限  
  38.             -->  
  39.             <jdbc-user-service data-source-ref="dataSource"  
  40.             group-authorities-by-username-query="SELECT g.id,g.groupname,role.role  
  41.                              FROM t_group AS g   
  42.                              LEFT OUTER JOIN t_group_role AS grouprole ON (g.id = grouprole.groupid)  
  43.                              LEFT OUTER JOIN t_role AS role ON (role.id = grouprole.roleid)  
  44.                              LEFT OUTER JOIN t_group_user AS groupuser on (g.id = groupuser.groupid)  
  45.                              LEFT OUTER JOIN t_admin ON (t_admin.id = groupuser.userid)  
  46.                              WHERE t_admin.nickname = ?"  
  47.                 users-by-username-query="SELECT t_admin.nickname AS username,t_admin.passwd as password,'true' AS enabled  
  48.                              FROM t_admin  
  49.                              WHERE t_admin.nickname = ?"  
  50.                 authorities-by-username-query="SELECT t_admin.nickname AS username,role.role as authorities  
  51.                                FROM t_admin   
  52.                                LEFT OUTER JOIN t_user_role AS userrole ON(t_admin.id = userrole.userid)  
  53.                                LEFT OUTER JOIN t_role AS role ON (userrole.roleid = role.id)  
  54.                                WHERE t_admin.nickname = ?" />  
  55.         </authentication-provider>  
  56.     </authentication-manager>  
  57.       
  58.     <!-- 自定义消息 -->  
  59.     <b:bean id="messageSource"  
  60.         class="org.springframework.context.support.ReloadableResourceBundleMessageSource">  
  61.         <b:property name="basename"  
  62.             value="classpath:org/springframework/security/messages" />  
  63.     </b:bean>  
  64.       
  65.     <!-- 定制登录过滤器 -->  
  66.     <beans:bean id="loginSuccessHandler" class="com.xxx.security.LoginSuccessHandler">  
  67.         <b:property name="defaultTargetUrl">  
  68.             <!-- 登录成功后转发到该页面 -->  
  69.             <b:value>/manager/films.jsp</b:value>  
  70.         </b:property>  
  71.     </beans:bean>  
  72.     <beans:bean id="authenticationProcessingFilter" class="com.xxx.security.LoginUsernamePasswordAuthenticationFilter">    
  73.     <beans:property name="authenticationSuccessHandler" ref="loginSuccessHandler"></beans:property>    
  74.     <beans:property name="authenticationFailureHandler" ref="authenticationFailureHandler"></beans:property>    
  75.     <beans:property name="authenticationManager" ref="authenticationManager"></beans:property>    
  76.     </beans:bean>  
  77.     <beans:bean id="authenticationFailureHandler" class="org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler">    
  78.     <beans:property name="defaultFailureUrl">  
  79.         <!-- 登录失败后转发到该页面 -->  
  80.         <beans:value>/login.jsp?error=true</beans:value>    
  81.     </beans:property>  
  82.     </beans:bean>  
  83.       
  84. </beans:beans>  

 

 

9、为影片页面films.jsp定制操作权限,定制后,不同的帐号登录会看到不同的操作,

比如,帐号"admin"属于权限组"Administrator",具备权限"ROLE_ADMIN",登录后

可以看到所有操作,帐号"test"属于权限组"影片维护",具备权限"ROLE_UPDATE_FILM"

和"ROLE_ADD_FILM",登录后只能看到"添加影片信息"和"修改"操作

 

films.jsp页面权限分布图:

 

 

films.jsp代码如下:

 

 

Html代码   收藏代码
  1. <%@ page language="java" contentType="text/html; charset=utf-8"  
  2. pageEncoding="utf-8" %>  
  3. <%@taglib uri="/struts-tags" prefix="s" %>  
  4. <%@ taglib prefix="security"  
  5.     uri="http://www.springframework.org/security/tags"%>  
  6. <%  
  7. String path = request.getContextPath();  
  8. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  9. %>  
  10. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  11. <html>  
  12.   <head>  
  13.     <title>信息操作</title>  
  14.   </head>  
  15.   <body>  
  16.     <s:form action="/film/findFilm" method="post">  
  17.         <s:submit value=" 获取所有影片信息 "></s:submit>  
  18.     </s:form>  
  19.     <!-- 添加影片操作,登录帐号具备ROLE_ADMIN权限或者ROLE_ADD_FILM权限可以执行 -->  
  20.     <security:authorize ifAnyGranted="ROLE_ADMIN,ROLE_ADD_FILM">  
  21.     <a href="<%=basePath %>manager/insertFilm.jsp">添加影片信息</a><br />   
  22.     </security:authorize>  
  23.       
  24.     <s:if test="filmList != null">  
  25.         <table border="1" width="40%">  
  26.     <tr>  
  27.         <th>序号</th><th>影片名</th><th>操作</th>  
  28.     </tr>   
  29.         <%-- 遍历影片信息 --%>  
  30.         <s:iterator var="film" value="filmList" status="st">  
  31.             <tr>  
  32.                 <td><s:property value="#st.index+1" /></td>  
  33.                 <td><s:property value="fname" /></td>  
  34.                 <td>  
  35.                       
  36.                     <!-- 修改影片操作,登录帐号具备ROLE_ADMIN权限或者ROLE_UPDATE_FILM权限可以执行 -->  
  37.                     <security:authorize ifAnyGranted="ROLE_ADMIN,ROLE_UPDATE_FILM">  
  38.                         <s:url id="detailUrl" value="/film/detailFilm">  
  39.                                     <s:param name="id" value="%{id}"/>  
  40.                                     </s:url>  
  41.                         <s:a href="%{detailUrl}">[修改]</s:a>&nbsp;  
  42.                     </security:authorize>  
  43.                     <!-- 删除影片操作,登录帐号具备ROLE_ADMIN权限或者ROLE_DELETE_FILM权限可以执行 -->  
  44.                     <security:authorize ifAnyGranted="ROLE_ADMIN,ROLE_DELETE_FILM">  
  45.                         <s:url id="deleteUrl" value="/film/deleteFilm">  
  46.                                     <s:param name="id" value="%{id}"/>  
  47.                                     </s:url>  
  48.                         <s:a href="%{deleteUrl}">[删除]</s:a>  
  49.                     </security:authorize>  
  50.             </td>  
  51.             </tr>  
  52.         </s:iterator>  
  53.     </table>  
  54.     </s:if>  
  55.   </body>  
  56. </html>  

 

 

 

30 
顶
5 
踩
分享到:   
参考知识库
Android知识库 38419  关注 | 3162  收录
React知识库 3770  关注 | 393  收录
人工智能基础知识库 17428  关注 | 212  收录
Java 知识库 36633  关注 | 3748  收录
评论
11 楼  liuyj0731 2016-06-02  
 
10 楼  PGKE 2015-11-09  
很详细 不错,实际操作一下 很实用
9 楼  java029 2015-08-13  
好东西,值得拥有!
8 楼  sengzun 2015-03-04  
如果我 直接在 地址栏中 /film/detailFilm?..get方式该传的参数都传了,会劫吗?
7 楼  sunlongan666 2014-01-03  
非常非常的兴奋看到了你的文章,非常感谢你的无私奉献。
6 楼  jiang_xiaohan 2012-09-24  
<!--仅拦截到manager下面的内容,具备access对应权限的-->  
        <intercept-url pattern="/manager/**" access="ROLE_ADMIN,ROLE_UPDATE_FILM,ROLE_DELETE_FILM,ROLE_ADD_FILM" />  

这里的权限能不能是动态的啊,就是直接读取数据库里的数据
5 楼  m635674608 2012-03-28  
可以把源码分享出来吗
4 楼  hanjs 2012-03-15  
不好意思,我弄错了。我把你写sql的地方都注释掉了,请问写sql的这个属性名,是固定的么?
3 楼  hanjs 2012-03-15  
我用这个报个错呢? 
2012-03-15 10:49:10,656 [main] ERROR [org.springframework.web.context.ContextLoader] - Context initialization failed 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.filterChains': Cannot resolve reference to bean 'org.springframework.security.web.SecurityFilterChain#0' while setting bean property 'sourceList' with key [0]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.web.SecurityFilterChain#0': Cannot create inner bean '(inner bean)' of type [org.springframework.security.web.authentication.logout.LogoutFilter] while setting constructor argument with key [1]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#2': Cannot resolve reference to bean 'org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices#0' while setting constructor argument with key [1]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices#0': Cannot create inner bean '(inner bean)' while setting bean property 'userDetailsService'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#3': Instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [org.springframework.security.core.userdetails.UserDetailsService org.springframework.security.config.http.UserDetailsServiceFactoryBean.cachingUserDetailsService(java.lang.String)] threw exception; nested exception is org.springframework.context.ApplicationContextException: No UserDetailsService registered. 
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:106)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveManagedList(BeanDefinitionValueResolver.java:353)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:153)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1325)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1086)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291) 
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:563)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425) 
at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:276) 
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:197) 
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47) 
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3795) 
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4252) 
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:760) 
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:740) 
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:544) 
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:980) 
at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:943) 
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:500) 
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1203) 
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:319) 
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:120) 
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1022) 
at org.apache.catalina.core.StandardHost.start(StandardHost.java:736) 
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1014) 
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443) 
at org.apache.catalina.core.StandardService.start(StandardService.java:448) 
at org.apache.catalina.core.StandardServer.start(StandardServer.java:700) 
at org.apache.catalina.startup.Catalina.start(Catalina.java:552) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:295) 
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:433)
2 楼  mabinwodejava 2011-08-29  
支持楼主,能结合一个项目讲是最好的了。希望楼主坚持下去,
1 楼  pengyan5945 2011-08-29  
我搞的ldap认证,mysql授权的那种。哎、、、、、难啊、、、、、、
HDLBits答案汇总 前言 该博客为本人做HDLBits习题时的心得记录总结,欢迎大家一起交流进步。 HDLBits网站链接 Verilog Language Basics Vectors Modules:Hierarchy Procedures More Verilog Features Circuits Combinational Logic Basic gates Multiplexers Arithmetic Circuits Karnaugh Map to Circuit Sequential Logic Latche 阅读详情

相关推荐

GEO芯片数据下载和探针ID转换(保姆级教程)

R语言安装、GEO芯片数据下载、探针ID转换

qq_43138237的博客 3万+

Spring Security(五)密码加密与更新密码

密码加密 方法1.securityconfig中加入代理方法passwordEncoder 方法2.数据库中加入前缀 密码的自动更新: 步骤1.前置需要代理方法 步骤2.实现service继承类UserDetailsPasswordService 步骤3.覆写更新密码的方法updatePassword...

weixin_43189971的博客 2797

《商用密码应用与安全性评估》第四章密码应用安全性评估实施要点4.1密码应用方案设计

密码应用方案设计

qq_40442137的博客 1472

Spring Security 重置密码

在本教程中—看看基本的我忘记了我的密码功能—以便用户可以在需要时安全地重置自己的密码。

白石的专栏 2884

Cursor+Playwright MCP实现UI全自动化,告别繁琐元素定位!

摘要:本文探讨了利用Cursor和PlaywrightMCP实现UI自动化测试的创新方法。通过将AI编程助手与浏览器自动化技术结合,解决了传统UI自动化测试中元素定位繁琐、维护成本高等痛点。文章详细介绍了项目架构设计、AI使用技巧(包括精准提问和编写.mdc规则文档),以及如何实现自然语言测试用例到自动化脚本的转换。最终实现了测试人员只需输入手工测试步骤,AI即可自动生成完整测试代码的智能化流程,并展望了通过Excel表格一键生成测试用例的未来发展方向,为UI自动化测试提供了高效解决方案。

baidu_29774881的博客 2795

JavaSpringBoot + VUE 相关开发环境配置合集

1.Java环境-JDK安装 参照:Java基础1-环境篇:JDK安装与环境变量配置 Java基础1-环境篇:JDK安装与环境变量配置_第一段代码的博客-优快云博客_jdk 2.Web服务器-Tomcat安装 原创Java服务器Tomcat安装和配置 3.Maven(后面为了项目兼容性,使用了3.0.5版本) 原创Maven安装和配置(Maven3.0.5) 4.nginx 原创nginx轻量级Web服务器安装和配置 5 数据库mysql 原创数据库Mysql安装和配置 ...

第一段代码的博客 3164

SpringSecurity设置登录账号密码的三种方式

SpringSecurity设置登录账号密码的三种方式

cy364328541的博客 5941

解锁RK3588多屏异显:MIPI+HDMI+EDP混合输出全攻略

本文详细介绍了RK3588处理器在MIPI+HDMI+EDP混合输出配置中的技术实现与应用。作为一款高性能处理器,RK3588凭借其强大的图形处理能力,支持多屏异显功能,可满足智能安防、工业控制等领域的多屏显示需求。文章从硬件连接、设备树配置、内核驱动设置到显示参数调整,系统阐述了配置流程,并针对信号不稳定、显示模式不匹配等常见问题提供了解决方案。通过智能安防监控案例,展示了该技术在提高监控效率方面的实际应用价值。随着技术进步,RK3588多屏异显技术将在更多领域发挥重要作用,为开发者提供灵活多样的显示方案

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 2433

security权限管理详解

Collection

程序员一博 3263

大模型知识边界探索:LLM设计的极限测试

最优化理论是数学中的一个分支,主要研究如何从给定的一组约束条件下找到最优解。目标函数:定义了需要优化的指标,可以是最大化或最小化。约束条件:定义了在优化过程中需要满足的限制条件。无约束优化:目标函数和约束条件都不存在。有约束优化:目标函数存在,但存在约束条件。多目标优化:同时需要优化多个目标函数。极限测试(Ultimate Test)是一种系统性的方法,用于评估大型模型(如LLM)在极端条件下的性能和稳定性。极端数据分布:与模型训练数据分布显著不同的数据集。极端计算资源。

AI天才研究院 432

Scratch全攻略:从入门到实践的编程之旅

Scratch 是一款由麻省理工学院(MIT)开发的图形化编程工具 ,它诞生的初衷是为了让编程教育更加普及,尤其是让孩子们能够轻松接触和学习编程。与传统的基于文本代码的编程方式不同,Scratch 通过将编程指令以图形化的积木形式呈现,极大地降低了编程的门槛,让编程变得如同搭积木一样简单有趣。

邓邓子的博客 1万+

【权限管理】使用spring security 实现默认登录,源码解析

【权限管理】使用spring security 实现默认登录,源码解析 其他文章可以通过菜单查看:【BookCase 菜单】 1、前言 在springboot 之前使用shiro实现权限管理的比较多,现在使用springboot 整合spring security 更方便。 2、实现 创建子项目 bookcase-auth 添加配置 <dependency> <groupId>com.github.xiaoymin</groupId> <artifac

燃尽余火的博客 2146

微搭低代码实现用户登录及注册功能

在小程序开发中,我们可以拿到微信用户的openid,openid可以作为用户的唯一标识,在查询数据的时候可以进行数据过滤实现查询自己提交的数据。那微搭中是否也有openid这个概念,可以获取用户自己提交的数据呢? 答案是肯定的,那要怎么去做呢?思路是先创建一个数据源方法,在数据源中返回openid,然后低代码中可以调用数据源的方法并且赋值给全局变量,这样在后续的业务中从全局变量就可以获取openid了,方便做数据权限的控制。 为了实现这个目的,我们从创建数据源开始。 创建数据源 我们先创建一个用户管理的数据

低代码布道师的博客 3000

java spring 权限_使用Spring Security实现权限管理

使用Spring Security实现权限管理1、技术目标了解并创建Security框架所需数据表为项目添加Spring Security框架掌握Security框架配置应用Security框架为项目的CRUD操作绑定权限注意:本文所用项目为"影片管理",参看2、权限管理需求描述为系统中的每个操作定义权限,如定义4个权限:1)超级权限,可以使用所有操作2)添加影片权限3)修改影片权限4)删除影片权...

weixin_35720393的博客 589

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

java c s 权限管理_【转】使用Spring Security实现权限管理

1、技术目标了解并创建Security框架所需数据表为项目添加Spring Security框架掌握Security框架配置应用Security框架为项目的CRUD操作绑定权限注意:本文所用项目为"影片管理",参看2、权限管理需求描述为系统中的每个操作定义权限,如定义4个权限:1)超级权限,可以使用所有操作2)添加影片权限3)修改影片权限4)删除影片权限为系统设置管理员帐号、密码为系统创建权限组,...

weixin_35671798的博客 150

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

使用 Spring Security 实现基于角色的权限管理

基于角色的权限管理(Role-Based Access Control,简称 RBAC)是一种通过分配用户角色来管理访问权限的机制。在这种机制下,不同的角色拥有不同的权限。例如,管理员可以执行所有操作,而普通用户只能访问特定资源。Spring Security 提供了灵活的权限管理机制,使得我们可以轻松实现基于角色的访问控制。在本篇博文中,我们详细介绍了如何在 Spring Boot 中配置 Spring Security,构建一个基于角色的权限管理系统。

qq_56694800的博客 1856

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

上一篇: Struts2之文件下载
下一篇: Java中使用Jedis操作Redis
javaPie
博客等级 码龄16年 1171粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值