文档章节

spring安全模块配置问题

Clover286
 Clover286
发布于 2017/02/27 12:16
字数 532
阅读 33
收藏 0

刚开始配置如下:

SecurityWebInitializer.java

package shop.config;

import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;

public class SecurityWebInitializer extends AbstractSecurityWebApplicationInitializer {
}

SecurityConfig.java

package shop.config;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.annotation.web.servlet.configuration.EnableWebMvcSecurity;
import org.springframework.security.web.authentication.rememberme.InMemoryTokenRepositoryImpl;

@Configuration
@EnableWebMvcSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

	@Autowired
	private DataSource dataSource;

	@Override
	protected void configure(HttpSecurity http) throws Exception {
		http.formLogin().and().authorizeRequests().antMatchers("/page/myOrder").authenticated().anyRequest().permitAll().and().csrf()
				.disable();
	}

	@Override
	protected void configure(AuthenticationManagerBuilder auth) throws Exception {

	}

}

WebInitializer.java

package shop.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
	@Override
	protected String[] getServletMappings() {
		return new String[] { "/" };
	}

	@Override
	protected Class<?>[] getRootConfigClasses() {
		return new Class<?>[] { RootConfig.class };
	}

	@Override
	protected Class<?>[] getServletConfigClasses() {
		return new Class<?>[] { WebConfig.class };
	}

}

WebConfig.java

package shop.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = { "shop.web" })
public class WebConfig extends WebMvcConfigurerAdapter {

	@Bean
	public ViewResolver viewResolver() {
		InternalResourceViewResolver resolver = new InternalResourceViewResolver();
		resolver.setPrefix("/WEB-INF/jsp/");
		resolver.setSuffix(".jsp");
		resolver.setExposeContextBeansAsAttributes(true);
		return resolver;
	}

	@Override
	public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
		configurer.enable();
	}

}

RootConfig.java

package shop.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportResource;

@Configuration
@ImportResource("classpath:spring/*.xml")
@ComponentScan(basePackages = { "shop.service" })
public class RootConfig {

}

报错如下:

严重: Exception starting filter springSecurityFilterChain
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'springSecurityFilterChain' is defined

这个文献启发我解决的:http://stackoverflow.com/questions/17132675/no-bean-named-springsecurityfilterchain-is-defined-spring-security-3-1

摘录原文如下:

Be sure to have security configuration in the root web application context, not in a servlet application context. This is very common mistake.

Root web application context is for global application beans, including security configuration. Servlet application context is there for servlet specific beans - e.g. controllers, handler mappings and handler adapters.

If you really want to have your security configuration within a servlet context, then you need to specifycontextAttribute for the DelegatingFilterProxy.

<init-param>
    <param-name>contextAttribute</param-name>
    <param-value>org.springframework.web.servlet.FrameworkServlet.CONTEXT.appServlet</param-value>
</init-param>

解决方案如下:在RootConfig.java中引入如下代码,意思是加载SecurityConfig.class配置类。

@Import(SecurityConfig.class)

分析:我原先的配置是按照spring实战第四版中微调的,书中的RootConfig.java中@ComponentScan(basePackages = { "shop" })包扫码了整个文件,同时过滤了一部分不需要的,意味着他扫描了配置类所在的包,也就是扫描到了安全模块的配置类SecurityConfig.class。而我改成了@ComponentScan(basePackages = { "shop.service" }),只扫码了service包,当我把这个配置改成扫描整个项目时也修复了该问题,不报错。

进一步:

我把包扫描改成:即加入对配置类所在包的扫描,项目也不报错了。

@ComponentScan(basePackages = { "shop.service","shop.config" })

总结如下:spring安全模块的配置类要注入spring,不然的启动不了。方法最好还是通过在根配置文件中@Import(SecurityConfig.class)

© 著作权归作者所有

共有 人打赏支持
Clover286
粉丝 8
博文 199
码字总数 65713
作品 0
武汉
程序员
创建自己的Spring Boot starter

Spring Boot starter 的组件 autoconfigure starter autoconfigure模块 包含自动配置的代码 starter模块 包含autoconfigure模块所依赖的包以及通用的包 命名 不要以 spring-boot 开头 xxx-sp...

666B
2017/10/25
0
0
使用 Smart Security 实现安全控制

很多朋友都问过我同样一个问题:“Smart 目前有身份认证与权限管理等安全控制功能吗?” 当听到这样的问题时,我真的非常不好意思,实在是没有这方面的特性。不过当我学习了 Shiro 以后,让我...

黄勇
2014/03/31
0
11
Spring实战读书笔记(1)

Spring的根本使命是? 简化Java开发 为了降低Java开发的复杂性,Spring采取了哪4种关键策略? 1、基于POJO的轻量级和最小侵入性编程 2、通过依赖注入和面向接口实现松耦合 3、基于切面和惯例...

祥林会跟你远走高飞
2014/12/30
0
0
【第1章 Spring概述与结构】1.2 Spring模块与结构

上一节:【第1章 Spring概述与结构】1.1 Spring起源与概述 基于Java Beans的配置管理,采用IOC的原理,特别是对依赖注入技术的使用。这些都用来减少各组件间对实施细则的相互依赖性。 一个核...

陶邦仁
2015/05/21
0
0
关于的一个有趣现象

先来看下A和B两个模块 A模块和B模块都分别拥有自己的Spring XML配置,并分别拥有自己的配置文件: A模块 A模块的Spring配置文件如下: Xml代码 <?xml version="1.0" encoding="UTF-8" ?> <bea...

stamen
2015/08/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

基于TP5的微信的公众号获取登录用户信息

之前讲过微信的公众号自动登录的菜单配置,这次记录一下在TP5项目中获取自动登录的用户信息并存到数据库的操作 基本的流程为:微信设置自动登录的菜单—>访问的URL指定的函数里获取用户信息—...

月夜中徘徊
58分钟前
0
0
youTrack

package jetbrains.teamsys.license.runtime; 计算lis package jetbrains.ring.license.reader; 验证lis 安装后先不要生成lis,要把相关文件进行替换 ring-license-checker-1.0.41.jar char......

max佩恩
今天
0
0
12.17 Nginx负载均衡

Nginx负载均衡 下面的dig看到可以返回2个IP,就是解析出来的IP,这样我们可以做负载均衡。 dig www.qq.com 1.vim /usr/local/nginx/conf/vhost/fuzai.conf 2.添加如下配置 upstream qq //定义...

芬野de博客
今天
0
0
SSE(Server Send Event 服务端发送事件)

package com.example.demo.controller;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframe......

Canaan_
今天
0
0
jvm调优

1.jvm运行模式 client模式:启动快,占用内存少,jit编译器生成代码的速度也更快. server模式:主要优势在于代码优化功能,这个功能对于服务器应用而言尤其重要. tiered server模式:结合了client与...

Funcy1122
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部