Spring Security JSP标签库

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

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

  • Authorize标签
  • Authentication标签
  • Accesscontrollist标签
  • Csrfinput标签
  • CsrfMetaTags标签

Authorize标签

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

它使用两个属性accessURL来检查请求是否获得授权。我们可以传递用户的角色来评估此标签。

在这个标签中编写的内容只有在满足属性条件时才会显示。例如:

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

Authentication标签

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

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

Accesscontrollist标签

此标签与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令牌值的meta标签。这些值对于在应用程序中的JavaScript中设置CSRF令牌非常有用。

此标签应放在HTML的<head>标签内。

Spring Security Taglib JAR

要实现这些标签中的任何一个,我们必须在应用程序中拥有Spring Security标签库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 Tool Suite)来创建项目。请查看以下示例。

创建项目

spring-security-jsp-tag-library.png

spring-security-jsp-tag-library2.png

spring-security-jsp-tag-library3.png

单击“完成”按钮,它将创建一个类似于这样的Maven项目:

spring-security-jsp-tag-library4.png

Spring Security配置

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

AppConfig.java

package cn.javatiku;  
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({ "cn.javatiku.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 cn.javatiku;  
  
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 Dispatcher。

// SecurityWebApplicationInitializer.java

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

创建另一个类,用于创建用户并在用户可访问性上应用身份验证和授权。

// WebSecurityConfig.java

package cn.javatiku;  
  
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("cn.javatiku")    
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 cn.javatiku.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 javatiku!    
</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>cn.javatiku</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-tag-library5.png

运行应用程序

右键单击项目,选择“Run on Server”。它会在浏览器中显示以下输出。

spring-security-jsp-tag-library6.png

点击“User”,通过提供在AppSecurityConfig文件中设置的凭据进行登录。

spring-security-jsp-tag-library7.png

成功登录后,会显示以下管理员页面。在这里,注意在authorize标签内部编写的内容未显示,因为已登录用户的角色是USER。

spring-security-jsp-tag-library8.png

注销,然后使用管理员凭据登录。

spring-security-jsp-tag-library9.png

作为管理员登录后,注意这次authorize标签被评估,并显示以下输出。

spring-security-jsp-tag-library10.png

标签: spring, Spring教程, Spring技术, Spring语言学习, Spring学习教程, Spring下载, Spring框架, Spring框架入门, Spring框架教程, Spring框架高级教程, Spring面试题, Spring笔试题, Spring编程思想