maven引入依赖
当前是用tomcat插件的形式来启动服务器
<packaging>war</packaging>
<properties>
<spring.version>5.0.5.RELEASE</spring.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<port>85</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
当前项目是war包 所以创建webapp 在web.xml文件中配置 springMvc前端控制器 和springSecurityFilterChain 过滤器链
注意:当前 springSecurityFilterChain 过滤器链 是每个认证授权必须首先调用的 且是自动调用【当前是如何自动注册的 我也不会 请大神指教】所以名称 必须是springSecurityFilterChain 否则会报错 找不到bean对象
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-security.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
spring配置文件中配置spring-security认证授权的服务类 密码加密方式
<security:authentication-manager>
<security:authentication-provider user-service-ref="userDetailsServiceImpl">
<security:password-encoder ref="passwordEncoder"></security:password-encoder>
</security:authentication-provider>
</security:authentication-manager>
<bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" />
自定义认证授权的服务类
当前并没有连接数据库 使用静态代码块初始化的数据 包括用户信息 用户权限
一般的最简单的权限认证授权应该是5张表 用户表 角色表 权限表 用户角色表 用户权限表【这应该是最简单的配置啦吧 如有错:请大神指正】
package com.wang.service;
import com.wang.entity.Auth;
import com.wang.entity.User;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Component;
import java.util.*;
import java.util.function.Consumer;
@Component
public class UserDetailsServiceImpl implements UserDetailsService {
static HashMap<String,User> map = new HashMap<>();
static {
Auth auth = new Auth("用户添加", "USER_ADD");
Auth auth1 = new Auth("用户删除", "USER_DELETE");
Auth auth3 = new Auth("用户修改", "USER_EDIT");
Auth auth2 = new Auth("用户插叙", "USER_FIND");
Set<Auth> authSet1 = new HashSet<>();
authSet1.add(auth);
authSet1.add(auth1);
Set<Auth> authSet2 = new HashSet<>();
authSet2.add(auth2);
authSet2.add(auth3);
User user1 = new User("1", "admin", "$2a$10$F0AZYwSJeQqbfoALUGF66uZMQPZBKl93QlLPx0t2w7Yp9xhujrL7K", authSet1);
User user2 = new User("2", "wang", "$2a$10$F0AZYwSJeQqbfoALUGF66uZMQPZBKl93QlLPx0t2w7Yp9xhujrL7K", authSet2);
map.put("admin",user1);
map.put("wang",user2);
}
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = map.get(username);
if(user == null){
return null;
}
String password = user.getPassword();
List<GrantedAuthority> list = new ArrayList<>();
user.getAuthList().forEach(auth -> list.add(new SimpleGrantedAuthority(auth.getAuthText())));
return new org.springframework.security.core.userdetails.User(username,password,list);
}
}
spring-security.xml配置文件中指定一些资源的访问 需要某个角色或权限
<security:http security="none" pattern="/js/**" />
<security:http security="none" pattern="/css/**" />
<security:http security="none" pattern="/img/**" />
<security:http security="none" pattern="/login.html" />
<security:http auto-config="true" use-expressions="true">
<security:intercept-url pattern="/index.html" access="isAuthenticated()" />
<security:intercept-url pattern="/a.html" access="isAuthenticated()" />
<security:intercept-url pattern="/b.html" access="hasAuthority('add')" />
<security:intercept-url pattern="/c.html" access="hasRole('ROLE_ADMIN')" />
<security:intercept-url pattern="/d.html" access="hasRole('ABC')" />
<security:form-login login-page="/login.html"
username-parameter="username"
password-parameter="password"
login-processing-url="/login.do"
default-target-url="/index.html"
authentication-failure-url="/login.html"
always-use-default-target="true"/>
<security:logout logout-url="/logout.do"
logout-success-url="/login.html"
invalidate-session="true"/>
<security:csrf disabled="true"></security:csrf>
</security:http>
controller层如何用注解的方式限制当前请求 需要指定的角色或授权
第一步 spring-security.xml配置文件中 开启注解权限控制
<security:global-method-security pre-post-annotations="enabled" />
第二步 controller包下新建类 HelloController
package com.atguigu.controller;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/hello")
public class HelloController {
@RequestMapping("/add")
@PreAuthorize("hasAuthority('add')")
public String add(){
System.out.println("add...");
return "success";
}
@RequestMapping("/update")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public String update(){
System.out.println("update...");
return "success";
}
@RequestMapping("/delete")
@PreAuthorize("hasRole('ABC')")
public String delete(){
System.out.println("delete...");
return "success";
}
}
最后这个简单示例就完成了 运行的时候 请从maven中找插件tomcat运行
