个性化阅读
专注于IT技术分析

Spring Security JSP标签库用法详解

Spring Security为jsp页面提供了自己的标签。这些标记用于访问安全信息并在JSP中应用安全约束。

以下标记用于保护应用程序的视图层。

  • 授权标签
  • 认证标签
  • 访问控制列表标签
  • CSRF输入日
  • CsrfMetaTags标签

授权标签

该标签用于授权目的。该标签评估并检查请求是否被授权。

它使用访问和URL两个属性来检查请求授权。我们可以通过用户角色来评估此标签。

仅当满足该属性时, 才会显示写入此标记内的内容。例如。

<sec:authorize access="hasRole('ADMIN')">
It will display only is user is admin
</sec:authorize>

认证标签

该标签用于访问存储在安全上下文中的身份验证。如果Authentication是UserDetails对象的实例, 则可用于获取当前用户详细信息。例如。

<sec:authentication property="principal.username">

访问控制列表标签

该标签与Spring Security的ACL模块一起使用。它检查指定域的必需权限列表。仅当当前用户拥有所有权限时, 它才会执行。例如。

<sec:accesscontrollist hasPermission="1, 2" domainObject="${someObject}">
 If user has all the permissions represented by the values "1" or "2" on the given object.
</sec:accesscontrollist>

CsrfInput标签

此标记用于为HTML表单创建CSRF令牌。要使用它, 请确保已启用CSRF保护。我们应该将此标签放在<form> </ form>标签内以创建CSRF令牌。例如。

<form method="post" action="/some/action">
                <sec:csrfInput />
                Name:<br />
                <input type="text" name="username" />
                ...
        </form>

CsrfMetaTags标签

它插入包含CSRF令牌, 表单字段, 标头名称和CSRF令牌值的元标记。这些值对于在应用程序中的JavaScript中设置CSRF令牌很有用。

该标记应放在HTML <head>标记内。

Spring Security Taglib JAR

要实现这些标签中的任何一个, 我们必须在应用程序中具有spring security taglib jar。也可以使用以下Maven依赖项将其添加。

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-taglibs</artifactId>
    <version>5.0.4.RELEASE</version>
</dependency>

Spring Security Taglib声明

在JSP页面中, 我们可以使用以下声明来使用taglib。

<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>

现在, 让我们看一个在Spring Security Maven项目中实现这些标签的示例。

我们正在使用STS(Spring工具套件)来创建项目。参见示例。

建立专案

Spring Security JSP标签库
Spring Security JSP标签库2
Spring Security JSP标签库3

单击完成按钮, 它将创建一个如下所示的maven项目:

Spring Security JSP标记库4

Spring安全配置

要在Spring MVC应用程序中配置Spring Security, 请将以下四个文件放入com.srcmini文件夹中。

AppConfig.java

package com.srcmini;
import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.ComponentScan;  
import org.springframework.context.annotation.Configuration;  
import org.springframework.web.servlet.config.annotation.EnableWebMvc;  
import org.springframework.web.servlet.view.InternalResourceViewResolver;  
import org.springframework.web.servlet.view.JstlView;  
  
@EnableWebMvc  
@Configuration  
@ComponentScan({ "com.srcmini.controller.*" })  
public class AppConfig {  
    @Bean  
    public InternalResourceViewResolver viewResolver() {  
        InternalResourceViewResolver viewResolver  
                          = new InternalResourceViewResolver();  
        viewResolver.setViewClass(JstlView.class);  
        viewResolver.setPrefix("/WEB-INF/views/");  
        viewResolver.setSuffix(".jsp");  
        return viewResolver;  
    }  
}

AppConfig用于设置视图文件的视图位置后缀。

// MvcWebApplicationInitializer.java

package com.srcmini;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;  
public class MvcWebApplicationInitializer extends  
        AbstractAnnotationConfigDispatcherServletInitializer {  
    @Override  
    protected Class<?>[] getRootConfigClasses() {  
        return new Class[] { WebSecurityConfig.class };  
    }  
    @Override  
    protected Class<?>[] getServletConfigClasses() {  
        // TODO Auto-generated method stub  
        return null;  
    }  
    @Override  
    protected String[] getServletMappings() {  
        return new String[] { "/" };  
    }  
}

此类用于初始化servlet调度程序。

// SecurityWebApplicationInitializer.java

package com.srcmini;
import org.springframework.security.web.context.*;  
public class SecurityWebApplicationInitializer  
    extends AbstractSecurityWebApplicationInitializer {  
  
}

再创建一个用于创建用户的类, 并对用户可访问性应用身份验证和授权。

// WebSecurityConfig.java

package com.srcmini;

import org.springframework.context.annotation.*;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;  
import org.springframework.security.config.annotation.web.configuration.*;  
import org.springframework.security.core.userdetails.*;
import org.springframework.security.core.userdetails.User.UserBuilder;  
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
@EnableWebSecurity  
@ComponentScan("com.srcmini")  
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {  
  
@Bean  
public UserDetailsService userDetailsService() {
	// ensure the passwords are encoded properly
	 UserBuilder users = User.withDefaultPasswordEncoder();
	 InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
	 manager.createUser(users.username("mohan").password("1mohan23").roles("USER").build());
	 manager.createUser(users.username("admin").password("admin123").roles("ADMIN").build());
	 return manager;
	} 
  
@Override  
protected void configure(HttpSecurity http) throws Exception {  
	  
	  http.authorizeRequests().
	  antMatchers("/index", "/").permitAll()
	  .antMatchers("/admin", "/user").authenticated()
	  .and()
	  .formLogin()
	  .and()
	  .logout()
	  .logoutRequestMatcher(new AntPathRequestMatcher("/logout"));
	    
}  
}

控制者

现在, 创建一个控制器来处理请求并进行回复。

// HomeController.java

package com.srcmini.controller;
import org.springframework.stereotype.Controller;  
import org.springframework.web.bind.annotation.RequestMapping;  
import org.springframework.web.bind.annotation.RequestMethod;
@Controller  
public class HomeController {  
    @RequestMapping(value="/", method=RequestMethod.GET)  
    public String index() {  
        return "index";  
    }  
    @RequestMapping(value="/user", method=RequestMethod.GET)  
    public String user() {  
       return "admin";
    }  
    @RequestMapping(value="/admin", method=RequestMethod.GET)  
    public String admin() {  
          
        return "admin";  
    }
}

视图

创建视图(jsp)文件以向用户显示输出。我们已经创建了三个JSP文件, 请参见下文。

// index.jsp

<html>  
<head>  
<title>Home Page</title>  
</head>  
<body>  
<a href="user">User</a> <a href="admin">Admin</a> <br> <br>
Welcome to srcmini!  
</body>  
</html>

// user.jsp

<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
<title>Home Page</title>  
</head>  
<body>  
Welcome to user page!  
</body>  
</html>

// admin.jsp

在管理页面中, 我们使用了authorize标签来仅在满足给定角色时才进行评估。

<%@ taglib uri="http://www.springframework.org/security/tags" prefix="security" %><html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<title>Home Page</title>  
</head>  
<body>  
Welcome to admin page!
<a href="logout">logout</a> <br><br>
<security:authorize access="hasRole('ADMIN')">
Hello ADMIN
</security:authorize>
<security:csrfInput/>
</body>  
</html>

项目依赖

我们的项目包含构建应用程序所需的以下依赖项。

// pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.srcmini</groupId>
  <artifactId>springtaglibrary</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  <properties>  
    <maven.compiler.target>1.8</maven.compiler.target>  
    <maven.compiler.source>1.8</maven.compiler.source>  
</properties>  
<dependencies>  
  <dependency>  
            <groupId>org.springframework</groupId>  
            <artifactId>spring-webmvc</artifactId>  
            <version>5.0.2.RELEASE</version>  
        </dependency>  
        <dependency>  
        <groupId>org.springframework.security</groupId>  
        <artifactId>spring-security-web</artifactId>  
        <version>5.0.0.RELEASE</version>  
    </dependency>  
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-core</artifactId>
    <version>5.0.4.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-taglibs -->
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-taglibs</artifactId>
    <version>5.0.4.RELEASE</version>
</dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-config -->
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
    <version>5.0.4.RELEASE</version>
</dependency>
        <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->  
<dependency>  
    <groupId>javax.servlet</groupId>  
    <artifactId>javax.servlet-api</artifactId>  
    <version>3.1.0</version>  
    <scope>provided</scope>  
</dependency>  
<dependency>  
    <groupId>javax.servlet</groupId>  
    <artifactId>jstl</artifactId>  
    <version>1.2</version>  
</dependency>  
<!-- https://mvnrepository.com/artifact/org.springframework/spring-framework-bom -->
</dependencies>  
  <build>  
    <plugins>  
        <plugin>  
            <groupId>org.apache.maven.plugins</groupId>  
            <artifactId>maven-war-plugin</artifactId>  
            <version>2.6</version>  
            <configuration>  
                <failOnMissingWebXml>false</failOnMissingWebXml>  
            </configuration>  
        </plugin>  
    </plugins>  
</build>  
</project>

添加所有这些文件后, 我们的项目如下所示:

Spring Security JSP标签库5

运行应用程序

右键单击该项目, 然后选择”在服务器上运行”。它向浏览器显示以下输出。

Spring Security JSP标签库6

通过提供在AppSecurityConfig文件中设置的凭据, 单击”用户和登录名”。

Spring Security JSP标签库7

成功登录后, 它将显示如下的管理页面。在这里, 请注意, 由于登录用户具有角色USER, 因此未显示写入authorize标记内的内容。

Spring Security JSP标签库8

注销, 然后通过提供管理员凭据以管理员身份登录。

Spring Security JSP标记库9

以管理员身份登录后, 请参阅这次的authorize标签进行评估, 并显示以下输出。

Spring Security JSP标签库10

下载示例

赞(0) 打赏
未经允许不得转载:srcmini » Spring Security JSP标签库用法详解
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

微信扫一扫打赏