这篇主要的内容
Spring Security 保护业务代码的执行
准备工作 .
1.创建HelloService接口
package zyk.service; //import org.springframework.security.access.annotation.Secured; public interface HelloService { //@Secured({ "ROLE_USER", "ROLE_ADMIN" }) public String sayHi(String userName); //@Secured({"ROLE_ADMIN"}) public String sayBye(String userName); }
2.实现类HelloServiceImpl
package zyk.service.impl; import zyk.service.HelloService; public class HelloServiceImpl implements HelloService { public String sayHi(String userName) { return "大家好!我是:" + userName; } public String sayBye(String userName) { return userName + " 跟大家说再见!"; } }
3.配置applicationContext.xml 使HelloService 交给Spring 管理.
<bean id="helloService" class="zyk.service.impl.HelloServiceImpl" />
4.创建 HelloServlet
package zyk.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.context.ApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; import zyk.service.HelloService; public class HelloServlet extends HttpServlet { /** * */ private static final long serialVersionUID = 1L; /** * Constructor of the object. */ public HelloServlet() { super(); } /** * Destruction of the servlet. <br> */ public void destroy() { super.destroy(); // Just puts "destroy" string in log // Put your code here } /** * The doGet method of the servlet. <br> * * This method is called when a form has its tag value method equals to get. * * @param request * the request send by the client to the server * @param response * the response send by the server to the client * @throws ServletException * if an error occurred * @throws IOException * if an error occurred */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); response.setCharacterEncoding("UTF-8"); String userName = request.getParameter("userName"); String method = request.getParameter("method"); ApplicationContext ctx = WebApplicationContextUtils .getWebApplicationContext(this.getServletContext()); HelloService helloService = ctx.getBean("helloService", HelloService.class); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); out.println("<HTML>"); out.println(" <HEAD><TITLE></TITLE></HEAD>"); out.println(" <BODY>"); if (method.equals("sayHi")) { out.println(helloService.sayHi(userName)); } else { out.println(helloService.sayBye(userName)); } out.println(" </BODY>"); out.println("</HTML>"); out.flush(); out.close(); } /** * The doPost method of the servlet. <br> * * This method is called when a form has its tag value method equals to * post. * * @param request * the request send by the client to the server * @param response * the response send by the server to the client * @throws ServletException * if an error occurred * @throws IOException * if an error occurred */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } /** * Initialization of the servlet. <br> * * @throws ServletException * if an error occurs */ public void init() throws ServletException { // Put your code here } }
5.在web.xml 中配置 HelloServlet 的映射路径.
<servlet> <description>This is the description of my J2EE component</description> <display-name>This is the display name of my J2EE component</display-name> <servlet-name>HelloServlet</servlet-name> <servlet-class>zyk.servlet.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/hello.action</url-pattern> </servlet-mapping>
6.在Index.jsp 中添加链接.
<a href="${pageContext.request.contextPath}/hello.action?method=sayHi&userName=<sec:authentication property="name" />">SayHi!</a> <br /> <a href="${pageContext.request.contextPath}/hello.action?method=sayBye&userName=<sec:authentication property="name" />">SayBye!</a>
第一次测试 User 和 admin 均可以调用 SayHi 和 SayBye 方法.
接下来 要实现的是
admin 可以 调用 SayHi 和 SayBye 方法.
user 只能 调用 SayHi 方法..
A)使用XML的方式
1.在applicationContext.xml 中 配置
<!-- XML 的方式 --> <security:global-method-security> <!-- 拥有ROLE_USER或者ROLE_ADMIN 权限的用户 可以访问 包 zyk.service 下的任意个类 里 返回值类型为任意类型 并 方法名为sayHi 的方法--> <security:protect-pointcut access="ROLE_USER,ROLE_ADMIN" expression="execution(* zyk.service.*.sayHi(..))"/> <!-- 第一个* :表示返回任意类型 第二个 * :表示任意的类 第三个* : 以say开头的任意方法 名 对应的是 : 拥有ROLE_ADMIN 权限的用户 可以访问 包 zyk.service 下的任意个类 里 返回值类型为任意类型 并以say开头的方法 (例如 sayHi 和 sayBye) --> <security:protect-pointcut access="ROLE_ADMIN" expression="execution(* zyk.service.*.say*(..))"/> </security:global-method-security>
第二次测试 Ok 。将上面的配置注释掉.换用Annotation 的方式 .
B)使用Annotation的方式
1.启用Annotation 配置applicationContext.xml
<!-- 启用annotation --> <security:global-method-security secured-annotations="enabled" jsr250-annotations="enabled" />
2.给HelloService接口里的方法加上 SpringSecurity的注解.用法很明显.
package zyk.service; import org.springframework.security.access.annotation.Secured; public interface HelloService { @Secured({ "ROLE_USER", "ROLE_ADMIN" }) public String sayHi(String userName); @Secured({"ROLE_ADMIN"}) public String sayBye(String userName); }
再次测试 Ok。
到此学习的资料 全部来自第一篇下的附件.《一步一步教你使用SpringSecurity》
相关推荐
在"springsecurity学习笔记"中,你可能会涉及以下主题: - Spring Security的基本配置,包括web安全配置和全局安全配置。 - 如何自定义认证和授权流程,比如实现自定义的AuthenticationProvider和...
Spring Security是一个功能强大且高度可定制的身份验证和授权框架,专门用于保护Java应用程序的安全性。它构建在Spring Framework基础之上,提供了全面的安全解决方案,包括身份验证、授权、攻击防护等功能。 Spring...
SpringSecurity是Java开发中用于构建安全Web应用的框架,它提供了强大的身份验证、...在学习过程中,分析提供的源代码和示例将有助于深入理解SpringSecurity的工作原理,并能帮助你在实际项目中有效地应用这些知识。
spring security方面的学习资料,包含:Spring+Security+3+与+CAS单点登录配置;Spring+Security3中文教程;Spring-Security安全权限管理手册;Spring+Security文库;还有一个学习笔记!
Spring Security 是一个强大的安全框架,主要用于Java应用的安全管理,它为Web应用和企业级应用提供了全面的...通过学习这些文档,开发者可以更好地理解Spring Security的工作原理,从而更有效地实现应用的安全控制。
Spring Security的学习过程可以分为入门、进阶和高级三个阶段。入门阶段主要是了解Spring Security的基本概念和配置方法。进阶阶段需要深入学习如何定制认证和授权流程、如何集成各种认证方式以及如何在实际项目中...
"springsecurity-namespace"可能指的是Spring Security的XML命名空间配置。在Spring Security的早期版本中,使用XML配置是最常见的实践。例如,你可能会看到以下片段: ```xml **" access="hasRole('ROLE_ADMIN')...
首先,Spring_Security-3.0.1_中文官方文档(翻译版).pdf是学习SpringSecurity的重要资源,它包含详细的框架介绍、配置指南和使用示例。这份文档会帮助我们理解SpringSecurity的基础架构,如安全上下文、过滤器链和...
SpringSecurity是Java领域中一款强大的安全框架,主要用于Web应用程序的安全管理。它提供了全面的身份验证、授权、会话...通过深入学习和实践,我们可以更好地掌握SpringSecurity,为我们的应用构建坚固的安全防线。
Spring Security 是一个强大的安全框架,用于为Java应用提供身份验证和授权服务。在这个完整的项目实例中...通过学习和实践这个项目,开发者能够深入理解Spring Security的工作原理,从而更有效地保护自己的Java应用。
5. **CSRF防护**:为了防止跨站请求伪造攻击,Spring Security提供了内置的CSRF保护,通过生成和验证CSRF令牌来确保只处理来自合法源的请求。 6. **记住我功能**:Spring Security支持“记住我”功能,允许用户在一...
Spring Security 是一个强大的安全框架,用于为Java应用提供全面的安全管理解决方案。它是Spring生态系统的组成部分,...无论你是初学者还是经验丰富的开发者,官方文档都是学习和掌握Spring Security不可或缺的资源。
5. **OAuth2支持**:对于现代Web应用,Spring Security还提供了OAuth2的支持,用于第三方应用的授权。 6. **Web安全**:防止CSRF攻击、XSS防护、Session Fixation等Web安全问题。 结合这两个框架的学习,你可以...
- `spring-security-core-4.0.0.CI-SNAPSHOT-sources.jar`:提供源代码,便于深入学习和调试。 - `spring-security-core-4.0.0.CI-SNAPSHOT.jar`:核心模块的主要库,包括安全性元数据、认证、授权和访问决策管理...
《Spring Security 3.1 学习指南及资源解析》 Spring Security是Java平台上的一款强大且高度可定制的安全框架,广泛应用于企业级Web应用的安全管理。本篇文章将围绕"Spring Security 3.1"这一主题,深入探讨其核心...
Spring Security OAuth2.0学习笔记 什么是认证、授权、会话。 Java Servlet为支持http会话做了哪些事儿。 基于session认证机制的运作流程。 基于token认证机制的运作流程。 理解Spring Security的工作原理,Spring ...
【Spring Security 学习总结】 Spring Security 是一个强大的和高度可定制的身份验证和访问控制框架,用于保护基于 Java 的应用程序。本学习总结文档主要针对初学者,旨在剖析一个不安全的应用程序并阐述如何通过 ...
5. **CSRF(跨站请求伪造)防护**:Spring Security 3.1默认提供了对CSRF攻击的防护,通过生成和验证CSRF令牌来确保只有合法的请求被处理。 6. **Remember Me服务**:此特性允许用户在一段时间内无需重新登录。...