上一篇,我们讲述的spring security的基础使用。但是对于一些复杂权限场景,我们需要更高级一些的功能。
我们接着往下展示它的高级部分。
的内部高级设置
在上一篇的Spring security设置示例中,我设置了authentication-manager来检查登录用户凭证,并使用标签中定义的纯文本用户。如下所示,您可以在此处为您的应用程序定义多个用户。
上面的方式,是简单的校验。对于更复杂的,比如要对数据库中的Users表进行身份验证,则可以使用替换 ... security:user-service>标记。如下。
在这里,您执行SQL查询以从数据库中的“users”表中获取用户名和密码。
类似地,用户名的授权权限也从“user_roles”数据库表中获取。
在这里您可以注意到我在“data-source-ref”属性中提到了数据源引用。这是“dataSource”。
因此,您需要在应用程序Context xml文件中定义一个id =“dataSource”的Bean。如下。
我在上面的数据库属性标记的“value”中提供了占位符。您可以用实际值替换它们。
如果要通过数据访问对象层(DAO)@Service对数据库中的Users表进行身份验证,则可以按如下方式进行配置。
在这里,您执行SQL查询以从数据库中的“users”表中获取用户名和密码。
类似地,用户名的授权权限也从“user_roles”数据库表中获取。
在这里您可以注意到我在标记中提到了user-service-ref =“loginService”。
spring安全性将使用名为“loginService”的存储库服务获取身份验证。
我们可以为我们的登录服务创建数据访问对象接口和实现。
比如:我们创建一个名为“LoginDAO.java”的接口java类
com.stiti.model.AppUser和 AppUserRole是Model类。
您可以使用自己的方式获取数据库用户和用户角色表并定义 findUserByUsername(String username)函数体。
findUserByUsername(String username)返回AppUser类型对象。
findUserByUsername(String username) 返回AppUser类型对象。
编写Spring MVC应用程序的Controller
现在我们需要编写Spring MVC应用程序的Controller。
我们需要在Controller类中为应用程序的主路径定义一个RequestMapping方法,该路径在我的示例“/”中。当用户打开应用程序URL例如“http://www.example.com/”时,执行为该请求映射定义的以下方法“loadHomePage()”。在此方法中,它首先获得对此URL的用户身份验证和授权。
Spring-security将首先检查spring配置中的,以查找允许访问此url路径的角色。在此示例中,它查找允许具有角色“USER”的用户访问此URL路径。如果用户有一个角色= USER,那么它将加载主页。
否则,如果它是匿名用户,则spring安全校验会将它重定向到登录页面。
在我们的Controller类中定义RequestMapping方法以加载自定义“登录页面”,前提是您在Spring 标记中提到了自定义登录页面URL。否则无需为Login页面定义任何控制器方法,spring会自动将用户带到spring-security的默认登录表单页面,这是一个由spring-security本身编写的简单JSP页面。
在我们的Controller类中为spring-security config中标记中定义的“logout-success-url”定义一个方法。对于此示例,我将“logout-success-url”定义为“/ logout”。
在Login.jsp中写入Login表单
现在让我们看一下登录表单中Login.jsp应包含的内容。
这里Form动作提交到“/ j_spring_security_check”。
“j_spring_security_check” - 是一个进行实际身份验证的Servlet,您必须将登录表单的操作映射到此Servlet。
“/ j_spring_security_check”URL必须由web.xml中的springSecurityFilterChain过滤器处理
结论
为了在应用程序中实现安全性,开发人员必须在他的应用程序中执行很多操作。Spring安全性通过简化方法来替代所有这些开销。它很容易插入应用程序,Spring安全本身可以处理应用程序的所有安全方面,并为您的应用程序提供严格的安全性。
思考:
authentication-manager有几种方式来校验用户名/密码?
答:
至少有三种,
- security:user配置固定的用户名/密码方式,最简单;
- jdbc-user-service 配置sql语句校验方式
- user-service-ref配置service bean进行校验,此方式自定义扩展