SpringBoot详细研究-03系统集成
据说杰克船长被黑客盗片了,看来信息安全依然任重而道远,本文以此为引子,来介绍下spring boot对于系统集成方面的支持。
Spring Security提供一套安全框架,通过IOC和AOP来实现安全功能,其涉及两个重要的概念,认证&授权。在Spring中,其应用只需要在一个配置类上注解@EnableWebSecurity并继承自WebSecurityConfigureAdapter即可。
用户认证:内存认证;JDBC认证,提供默认的数据库结构;通用的用户(推荐),实现UserDetailsService。
请求授权:常见安全处理方法包括,anyRequest匹配所有请求路径(支持antMatchers,和正则regexMachers),,anonymous()匿名可访问,access(String)参数EL表达式结果未true时可访问,hasAnyAuthority()任意权限可访问,hasAnyRole任意角色可访问,hasIpAddress任意IP可访问,HasRole角色可访问,permitAll()用户可任意访问,rememberMe允许rem登录,authenticated用户登录后可访问。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 spring.activemq.broker-url=tcp://localhost:61616 2 spring.activemq.user= 3 spring.activemq.password= 4 spring.activemq.in-memory=true 5 spring.activemq.pool.enabled=false 6 7 Maven: 8 <dependency> 9 <groupId>org.springframework</groupId> 10 <artifactId>spring-jms</artifactId> 11 </dependency> 12 <dependency> 13 <groupId>org.apache.activemq</groupId> 14 <artifactId>activemq-client</artifactId> 15 </dependency>
SpringBoot提供的默认配置,包括自动配置一个内存用户user,忽略/css/**等静态文件的拦截,自动配置securityFilterChainRegistration的Bean,并且对oauth2有很好的支持。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 security.user.name=user 2 security.user.password= 3 security.user.role=USER 4 security.require-ssl=false 5 security.enable-csrf=false 6 security.basic.enabled=true 7 security.basic.realm=Spring 8 security.basic.path= 9 security.basic.authorize-mode=authenticated 10 security.filter-order=0 11 security.headers.xss=false 12 security.headers.cache=false 13 security.headers.frame=false 14 security.headers.content-type=false 15 security.headers.hsts=all 16 security.sessions=stateless 17 security.ignored= 18 19 Maven: 20 <dependency> 21 <groupId>org.springframework.boot</groupId> 22 <artifactId>spring-boot-starter-security</artifactId> 23 </dependency>
实践中,需要对自己构建的User进行扩展,比如创建一个UserWrapper类,其实现UserDetails接口(关于password与passwordhash,salt),然后提供一个实现了UserDetailsService的类,并注册到sercurityConfig即可。
Tip:
Http会话劫持:http://www.cnblogs.com/baibaomen/p/http-session-hijack.html
异步消息的主要目的是系统间的通信,其涉及两个重要概念,消息代理message broker和目的地destination,当消息发送者发送消息后,消息将由消息代理接管,消息代理保证消息传递到指定目的地。异步消息主要包含两种形式的目的地,分别是队列queue(用于点对点通信)和主题topic(用于发布/订阅式的消息通信)。
点对点式:发送者发送消息,代理获取消息后放入队列,当接收者来接收,消息将被取出,这是这条消息离队。
发布/订阅式:发送者发送消息到主题,而多个消息接收者监听这个主题。
JMS(Java Message Service)即Java消息服务,是基于JVM消息代理的规范,ActiveMQ、HornetQ是JMS的实现。
AMQP(Advance Message Queuing Protocol)也是一个消息规范。但它不仅兼容JMS,也支持其他平台,主要实现由RabbitMQ。
ActiveMQ
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 spring.activemq.broker-url=tcp://localhost:61616 2 spring.activemq.user= 3 spring.activemq.password= 4 spring.activemq.in-memory=true 5 spring.activemq.pool.enabled=false 6 Maven: 7 <dependency> 8 <groupId>org.springframework</groupId> 9 <artifactId>spring-jms</artifactId> 10 </dependency> 11 <dependency> 12 <groupId>org.apache.activemq</groupId> 13 <artifactId>activemq-client</artifactId> 14 </dependency>
Tip:
Docker启动时:docker run -d -p 61616:61616 -p 8161:8161 --name activemq1 cloudesire/activemq
其中61616为消息代理的端口,8161为ActiveMQ管理页面的端口
RabbitMQ
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 spring.rabbitmq.host=localhost 2 spring.rabbitmq.port=5672 3 spring.rabbitmq.username=admin 4 spring.rabbitmq.password=admin 5 6 Maven: 7 <dependency> 8 <groupId>org.springframework.boot</groupId> 9 <artifactId>spring-boot-starter-amqp</artifactId> 10 </dependency>
Tip:
Docker启动时:docker run -d -p 5672: 5672-p 15672:15672 --name rabbitmq1 rabbitmq:3-management
其中5672为消息代理的端口,15672为ActiveMQ管理页面的端口(可以用guest:guest登录)
Spring Integration提供局域Spring的EIP(Enterprise Integration Patterns企业集成模式,ESB? )的实现,解决不同系统间交互的问题,通过异步消息驱动来达到系统间的松耦合,Spring Integration主要由Message, Channel, Message EndPoint组成,可以看到,除了Channel,其他和消息部分的知识点相同。
Message:由消息体payload和消息头header两部分组成,消息体可以任何数据类型,如XML,json,java对象等。
Channel: MessageChannel顶级接口, PollableChannel具备轮询获得消息,SubscribableChannel发送信息到订阅了MessageHandler的订阅者, PublishSubscribeChannel广播消息给所有订阅者,QueueChannel用一个可以设置大小的队列保存消息,PriorityChannel按照优先级将数据存储到队列,RendezvousChannel确保每个接受者接收到消息后再发送消息,DirectChannel默认的消息通道,允许消息发个一个订阅者,然后阻碍发送知道消息被接受,ExecutorChannel可绑定到一个多线程的taskExecutor。此外,还提供了ChannelInterceptor来处理消息。
MessageEndPoint:是处理消息的组件,可以控制通道路由,可用的消息端点包括ChannelAdapter,其是单向的,入站通道只接受消息,出站通道只输出消息,支持各种类型的协议;Gateway提供双向的请求/返回;Service Activator调用Bean来处理消息;Router根据消息体类型、消息头的值和已定义好的接收表作为条件,来决定消息的传输通道;Filter类似路由,由于决定消息是否可以传递;Splitter将消息拆分处理;Aggregator合并消息;Enricher增强器;Transformer转换器;Bridge桥接两个消息通道。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 Maven: 2 <dependency> 3 <groupId>org.springframework.boot</groupId> 4 <artifactId>spring-boot-starter-integration</artifactId> 5 </dependency> 6 <dependency> 7 <groupId>org.springframework.boot</groupId> 8 <artifactId>spring-boot-starter-mail</artifactId> 9 </dependency> 10 <dependency> 11 <groupId>org.springframework.integration</groupId> 12 <artifactId>spring-integration-feed</artifactId> 13 </dependency> 14 <dependency> 15 <groupId>org.springframework.integration</groupId> 16 <artifactId>spring-integration-mail</artifactId> 17 </dependency>
Tip:这部分在实验时遇到了一些问题,暂放。
- 其他
Spring Batch部分,感觉实用性不是很强 ,还是考虑之后学习使用Quartz来做为job的一揽子解决方案。
参考资料
-
汪云飞. Spring Boot实战[M]. 北京:电子工业出版社, 2016.
出 处:http://www.cnblogs.com/xiong2ge/
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。