基于Spring安全角色的访问授权示例

 

基于Spring安全角色的访问授权示例

 

今天我们将研究基于Spring安全角色的访问和授权示例。但是在阅读这篇文章之前,请先阅读我之前关于“ Spring 4 Security MVC Login Logout Example ”的帖子,以获得有关Spring 4 Security的一些基本知识。

Spring安全角色

在这篇文章中,我们将讨论如何定义,使用和管理Spring Web Application中的“USER”,“ADMIN”等弹簧安全角色。

像我之前的帖子一样,这篇帖子的例子也是使用Spring 4 MVC Security with In-Memory Store和Spring Java Configuration Feature来开发应用程序。这意味着我们不会使用web.xml文件,也不会编写一行Spring XML Configuration。

我们将使用“内存存储”选项来存储和管理用户凭据。

我们将使用Spring 4.0.2.RELEASE,Spring STS 3.7 Suite IDE,带有Java 1.8的Spring TC Server 3.1和Maven构建工具来开发此示例。

基于Spring安全角色的访问授权示例

项目名称:SpringMVCSecruityMavenRolesApp


<artifactId>SpringMVCSecruityMavenRolesApp</artifactId>

<build>
  <finalName>SpringMVCSecruityMavenRolesApp</finalName>
</build>
</project>

LoginSecurityConfig.java


package com.journaldev.spring.secuity.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class LoginSecurityConfig extends WebSecurityConfigurerAdapter {

	@Autowired
	public void configureGlobal(AuthenticationManagerBuilder authenticationMgr) throws Exception {
		authenticationMgr.inMemoryAuthentication()
			.withUser("jduser").password("jdu@123").authorities("ROLE_USER")
			.and()
			.withUser("jdadmin").password("jda@123").authorities("ROLE_USER","ROLE_ADMIN");
	}
	
	@Override
	protected void configure(HttpSecurity http) throws Exception {

		
		http.authorizeRequests()
			.antMatchers("/homePage").access("hasRole('ROLE_USER') or hasRole('ROLE_ADMIN')")
			.antMatchers("/userPage").access("hasRole('ROLE_USER')")
			.antMatchers("/adminPage").access("hasRole('ROLE_ADMIN')")
			.and()
				.formLogin().loginPage("/loginPage")
				.defaultSuccessUrl("/homePage")
				.failureUrl("/loginPage?error")
				.usernameParameter("username").passwordParameter("password")				
			.and()
				.logout().logoutSuccessUrl("/loginPage?logout"); 
		
	}
}

代码说明

LoginController.java


package com.journaldev.spring.web.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class LoginController {

	@RequestMapping(value = { "/"}, method = RequestMethod.GET)
	public ModelAndView welcomePage() {
		ModelAndView model = new ModelAndView();
		model.setViewName("welcomePage");
		return model;
	}

	@RequestMapping(value = { "/homePage"}, method = RequestMethod.GET)
	public ModelAndView homePage() {
		ModelAndView model = new ModelAndView();
		model.setViewName("homePage");
		return model;
	}
	
	@RequestMapping(value = {"/userPage"}, method = RequestMethod.GET)
	public ModelAndView userPage() {
		ModelAndView model = new ModelAndView();
		model.setViewName("userPage");
		return model;
	}
	
	@RequestMapping(value = {"/adminPage"}, method = RequestMethod.GET)
	public ModelAndView adminPage() {
		ModelAndView model = new ModelAndView();
		model.setViewName("adminPage");
		return model;
	}
	
	@RequestMapping(value = "/loginPage", method = RequestMethod.GET)
	public ModelAndView loginPage(@RequestParam(value = "error",required = false) String error,
	@RequestParam(value = "logout",	required = false) String logout) {
		
		ModelAndView model = new ModelAndView();
		if (error != null) {
			model.addObject("error", "Invalid Credentials provided.");
		}

		if (logout != null) {
			model.addObject("message", "Logged out from JournalDEV successfully.");
		}

		model.setViewName("loginPage");
		return model;
	}

}

代码说明
除了前面的帖子示例之外,这里我们还添加了两个新的URL。

homePage.jsp


<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<a href="${pageContext.request.contextPath}/userPage">JD User</a> | <a href="${pageContext.request.contextPath}/adminPage">JD Admin</a> | <a href="javascript:document.getElementById('logout').submit()">Logout</a>

<h3>Welcome to JournalDEV Tutorials</h3>
<ul>
   <li>Java 8 tutorial</li>
   <li>Spring tutorial</li>
   <li>Gradle tutorial</li>
   <li>BigData tutorial</li>
</ul>

<c:url value="/logout" var="logoutUrl" />
<form id="logout" action="${logoutUrl}" method="post" >
  <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
</form>

在这里,我们在顶部框架添加了三个类似菜单的选项。我已在上一篇文章中讨论过“退出”。

新的两个链接是:

注意: -在实时应用程序中,我们将仅显示“用户”角色的“JD用户”链接并隐藏“JD Admin”链接。要测试它是否可以被“USER”角色访问,并且还要查看确切的错误消息,我们还没有隐藏此链接。

adminPage.jsp


<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<h3>Welcome to JournalDEV Tutorials</h3>
<h3>Admin Page</h3>

<c:url value="/logout" var="logoutUrl" />
<form id="logout" action="${logoutUrl}" method="post" >
  <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
</form>
<c:if test="${pageContext.request.userPrincipal.name != null}">
	<a href="javascript:document.getElementById('logout').submit()">Logout</a>
</c:if>

userPage.jsp


<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<h3>Welcome to JournalDEV Tutorials</h3>
<h3>User Page</h3>

<c:url value="/logout" var="logoutUrl" />
<form id="logout" action="${logoutUrl}" method="post" >
  <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
</form>
<c:if test="${pageContext.request.userPrincipal.name != null}">
	<a href="javascript:document.getElementById('logout').submit()">Logout</a>
</c:if>

我们现在已经完成了应用程序开发。是时候看看我们的项目最终结构并测试应用程序了。

弹簧安全角色示例

  1. 在Spring STS Suite中创建一个“Simple Spring Web Maven”项目,其中包含以下详细信息。
  2. 使用我之前帖子中的相同pom.xml文件进行以下更改
  3. 使用我之前发布的所有Java和JSP文件。我们将在此处仅讨论更新或新添加的内容。
  4. 更新LoginSecurityConfig.java文件以配置“USER”和“ADMIN”等用户角色。
    
    antMatchers("/homePage")
       .access("hasRole('ROLE_USER') or hasRole('ROLE_ADMIN')")
    

    此代码段配置“/ homePage”可用于USER和ADMIN角色。

    
     .antMatchers("/userPage").access("hasRole('ROLE_USER')")
     .antMatchers("/adminPage").access("hasRole('ROLE_ADMIN')")
    

    此代码段配置“/ userPage”只能由“USER”角色访问,而“/ adminPage”只能由“ADMIN”角色访问。

    如果其他角色访问这些页面,我们将访问“403 Access is Denied”错误消息。

    1. 在configureGlobal()方法中,我们添加了两个用户:一个用户具有“ROLE_USER”角色,另一个用户具有“ROLE_USER”和“ROLE_ADMIN”角色。这意味着第二个用户将充当管理员用户。像这样我们可以配置任意数量的用户和角色。
    2. 我们可以使用权限(ROLE)或角色(ROLE)方法在我们的应用程序中配置角色。
    3. authority()和roles()方法之间的区别:
      • authorities()需要完整的角色名称,如“ROLE_USER”
      • roles()需要角色名称,如“USER”。它会自动将“ROLE_”值添加到此“USER”角色名称。
    4. 在configure()方法中,我们已经定义了具有所需访问角色的不同URL。
  5. 更新LoginController.java控制器文件以定义新的URL访问路径,如下所示。
    1. USER Role使用“/ userPage”来访问和执行普通用户活动。
    2. ADMIN Role使用“/ adminPage”来访问和执行Admin用户活动。ADMIN角色也可以访问“/ userPage”URL。
  6. 更新了homePage.jsp文件以提供用户和管理员角色的特定活动。
    1. JD用户:可由“USER”和“ADMIN”角色访问
    2. JD Admin:只能由“ADMIN”角色访问
  7. 添加新的adminPage.jsp文件以充当“ADMIN”角色的主页。
  8. 添加新的userPage.jsp文件以充当“USER”角色的主页。
  9. 最终项目结构如下所示:

Spring安全角色示例应用程序测试

它将访问默认的Application欢迎页面,如下所示:

安全性安全角色登录inmemory示例

基于Spring安全角色的访问授权示例

用户名:jduser 
密码:jdu @ 123

Spring安全角色

现在我们将看到带有3个菜单选项的Application HomePage:“JD User”,“JD Admin”和“Logout”。

单击“JD User”链接。由于我们使用“USER”角色凭证登录到应用程序,我们可以访问此链接,如下所示。

基于Spring安全角色的访问

只需在Spring STS IDE中使用后退箭头,这次点击“JD Admin”链接即可。

Spring安全角色

由于我们已使用“USER”角色凭据登录,因此我们无法访问此链接。这就是我们看到此错误消息的原因:“403 Access被拒绝”。

用户名:jdadmin 
密码:jda @ 123

这次我们可以成功访问“JD Admin”链接,如下所示。

Spring安全角色示例

测试“注销”链接以退出应用程序。

  1. 右键单击Spring STS IDE中的Project并选择“Run AS >> Run on Server”选项。
  2. 点击“登录JournalDEV”链接。现在您在登录页面。
  3. 首次使用“USER”角色凭证登录:
  4. 现在记录并再次使用ADMIN Role Credentials登录

这就是Spring安全角色示例,它提供对Web应用程序页面的授权访问。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值