Spring Security

                                               Spring Security  

Spring Security 是一个能够为基于 Spring 的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在 Spring 应用上下文中配置的 Bean,充分利用了 Spring IoC,DI(控制反转 Inversion of Control ,DI:Dependency Injection 依赖注入)和 AOP(面 向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控 制编写大量重复代码的工作。

使用步骤:新建一个web工程

1导入依赖

<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>4.1.0.RELEASE</version>

</dependency>

<dependency>

<groupId>org.springframework.security</groupId>

<artifactId>spring-security-config</artifactId>

<version>4.1.0.RELEASE</version>

</dependency>

<dependency>

<groupId>javax.servlet</groupId>

<artifactId>servlet-api</artifactId>

<version>2.5</version>

<scope>provided</scope>

</dependency>

</dependencies>

<build>

  <plugins>

      <!-- java编译插件 -->

  <plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-compiler-plugin</artifactId>

<version>3.2</version>

<configuration>

<source>1.7</source>

<target>1.7</target>

<encoding>UTF-8</encoding>

</configuration>

  </plugin>      

      <plugin>

<groupId>org.apache.tomcat.maven</groupId>

<artifactId>tomcat7-maven-plugin</artifactId>

<configuration>

<!-- 指定端口 -->

<port>9090</port>

<!-- 请求路径 -->

<path>/</path>

</configuration>

     </plugin>

   </plugins>  

    </build>

  2.添加web.xml

 <context-param>

<param-name>contextConfigLocation</param-name>

<param-value>classpath:spring-security.xml</param-value>  //加载配置文件

 </context-param>

 <listener>

<listener-class>

org.springframework.web.context.ContextLoaderListener

</listener-class>

 </listener>

 <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>

3.在resources下新建spring-security.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans:beans xmlns="http://www.springframework.org/schema/security"

xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd">

<!-- 设置页面不登陆也可以访问 -->

<http pattern="/login.html" security="none"></http>

<http pattern="/login_error.html" security="none"></http>

<!-- 页面的拦截规则    use-expressions:是否启动SPEL表达式 默认是true -->

<http use-expressions="false">

<!-- 当前用户必须有ROLE_USER的角色 才可以访问根目录及所属子目录的资源 -->

<intercept-url pattern="/**" access="ROLE_USER"/>

<!-- 开启表单登陆功能 -->

<form-login   login-page="/login.html" default-target-url="/index.html" authentication-failure-url="/login_error.html"/>

           <csrf disabled="true"/>

<headers>

<frame-options policy="SAMEORIGIN"/>

</headers>

<logout/>

<csrf disabled="true"/>

</http>

 

<!-- 认证管理器     注测试用了一个固定的用户名和密码,和赋予了一个ROLE_USER角色,实际中需和数据库匹配,并且密码是加密的-->

<authentication-manager>

<authentication-provider>

<user-service>

<user name="admin" password="123456" authorities="ROLE_USER"/>

</user-service>

</authentication-provider>

</authentication-manager>

</beans:beans>

4  编写登录页面

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>登陆</title>

</head>

<body>

--欢迎的登陆我的系统--

<form action="/login" method="post">

用户名:<input name="username"><br>

密码:<input name="password"><br>

<button>登陆</button>

</form>

</body>

</html>

  5.测试

获取用户名:可在controller类里使用:在返回给前端即可

String name = SecurityContextHolder.getContext().getAuthentication().getName();

退出登录,可直接调用spring-security.xml中的定义好的href=”../logout”.

     BCrypt 加密算法 用户表的密码通常使用 MD5 等不可逆算法加密后存储,为防止彩虹表破解更会先使用 一个特定的字符串(如域名)加密,然后再使用一个随机的 salt(盐值)加密。 特定字符 串是程序代码中固定的,salt 是每个密码单独随机,一般给用户表加一个字段单独存储,比 较麻烦。 BCrypt 算法将 salt 随机并混入最终加密后的密码,验证时也无需单独提供之前的 salt,从而无需单独处理 salt 问题。

   使用步骤

1.在spring-security.xml中修改 认证管理器

<authentication-manager>

<authentication-provider user-service-ref="userDetailService">

<password-encoder ref="bcryptEncoder"></password-encoder>

</authentication-provider>

</authentication-manager>

<beans:bean id="userDetailService" class="com.pinyougou.service.UserDetailsServiceImpl">

</beans:bean>//配置角色赋值的实现类

<beans:bean id="bcryptEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder">

</beans:bean>  

2   角色赋值。新建一个实现类UserDetailsServiceImpl 实现 UserDetailsService 重写方法

 private SellerService sellerService;

    public void setSellerService(SellerService sellerService) {

        this.sellerService = sellerService;

    }

    @Override

    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

          List<GrantedAuthority> grantAuths = new ArrayList<>();

          grantAuths.add(new SimpleGrantedAuthority("ROLE_ADMIN"));

            TbSeller seller = sellerService.findOne(username);

            return  new User(username,seller.getPassword(),grantAuths);

      }

3    在controller中对密码进行加密:

 BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();

String password = passwordEncoder.encode(seller.getPassword());

seller.setPassword(password);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值