Spring教程-Spring Security JSP标签库
 
            
            Spring Security JSP标签库
Spring Security提供了自己的JSP标签。这些标签用于在JSP中访问安全信息并应用安全约束。
以下标签用于保护应用程序的视图层。
- Authorize标签
- Authentication标签
- Accesscontrollist标签
- Csrfinput标签
- CsrfMetaTags标签
Authorize标签
此标签用于授权目的。该标签评估并检查请求是否已授权。
它使用两个属性access和URL来检查请求是否获得授权。我们可以传递用户的角色来评估此标签。
在这个标签中编写的内容只有在满足属性条件时才会显示。例如:
<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)来创建项目。请查看以下示例。
创建项目



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

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>  
添加所有这些文件后,我们的项目如下所示:

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

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

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

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

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

 
          
          
         