springsecurity是否用了apache的shiro呀

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springsecurity是否用了apache的shiro呀相关的知识,希望对你有一定的参考价值。

参考技术A 不是呀 这两个原理都不一样

springsecurity 的实现原理:
核心 :登陆验证拦截器AuthenticationProcessingFilter 资源管理拦截器AbstractSecurityInterceptor以及AuthenticationManager、accessDecisionManager等组件来支撑。
流程:用户登陆,会被AuthenticationProcessingFilter拦截,调用AuthenticationManager的实现,而且AuthenticationManager会调用ProviderManager来获取用户验证信息(不同的Provider调用的服务不同,因为这些信息可以是在数据库上,可以是在LDAP服务器上,可以是xml配置文件上等),如果验证通过后会将用户的权限信息封装一个User放到spring的全局缓存SecurityContextHolder中,以备后面访问资源时使用。 访问资源(即授权管理),访问url时,会通过AbstractSecurityInterceptor拦截器拦截,其中会调用FilterInvocationSecurityMetadataSource的方法来获取被拦截url所需的全部权限,在调用授权管理器AccessDecisionManager,这个授权管理器会通过spring的全局缓存SecurityContextHolder获取用户的权限信息,还会获取被拦截的url和被拦截url所需的全部权限,然后根据所配的策略(有:一票决定,一票否定,少数服从多数等),如果权限足够,则返回,权限不够则报错并调用权限不足页面

shiro的实现原理:
Shiro的三个核心组件:Subject, SecurityManager 和 Realms.
Subject:即“当前操作用户”。但是,在Shiro中,Subject这一概念并不仅仅指人,也可以是第三方进程、后台帐户(Daemon Account)或其他类似事物。它仅仅意味着“当前跟软件交互的东西”。但考虑到大多数目的和用途,你可以把它认为是Shiro的“用户”概念。 Subject代表了当前用户的安全操作,SecurityManager则管理所有用户的安全操作。
SecurityManager:它是Shiro框架的核心,典型的Facade模式,Shiro通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务。
Realm: Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。
从这个意义上讲,Realm实质上是一个安全相关的DAO:它封装了数据源的连接细节,并在需要时将相关数据提供给Shiro。当配置Shiro时,你必须至少指定一个Realm,用于认证和(或)授权。配置多个Realm是可以的,但是至少需要一个。
Shiro内置了可以连接大量安全数据源(又名目录)的Realm,如LDAP、关系数据库(JDBC)、类似INI的文本配置资源以及属性文件等。如果缺省的Realm不能满足需求,你还可以插入代表自定义数据源的自己的Realm实现。追问

我看我公司用的是springsecurity,但是又导了shiro的jar包

本回答被提问者和网友采纳

SSM整合SpringSecurity

1.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>com.qingfeng</groupId>
	<artifactId>SpringSecurity</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>

	<properties>
		<spring.security.version>5.1.3.RELEASE</spring.security.version>
	</properties>

	<dependencies>


		<!--引入Servlet支持 -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>3.1.0</version>
			<scope>provided</scope>
		</dependency>


		<!--引入Spring Security支持 -->
		<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-core -->
		<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-core</artifactId>
			<version>${spring.security.version}</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-web -->
		<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-web</artifactId>
			<version>${spring.security.version}</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-config -->
		<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-config</artifactId>
			<version>${spring.security.version}</version>
		</dependency>
	</dependencies>	
	
	<build>
        <plugins>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <configuration>
                    <!-- 指定端口 -->
                    <port>9001</port>
                    <!-- 请求路径 -->
                    <path>/</path>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

  

2.web.xml配置

<?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_2_5.xsd"
         version="2.5">
    <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>
</web-app>

  

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

	<!--页面拦截规则 -->
	<http>
		<!-- intercept-url:表示拦截规则 pattern:页码的匹配规则,在webapp下面的 access:资源的控制规则,需要什么的条件 -->
		<!-- 所有的资源都需要是ROLE_ADMIN的角色可以访问 -->
		<intercept-url pattern="/**"
			access="hasRole(\'ROLE_ADMIN\')" />
		<!-- 表单登录 
				login-page:登录页面
				default-target-url:默认跳转页面
				authentication-failure-url:登录错误,跳转错误页面
		-->
		<form-login  login-page="/login.html"  default-target-url="/index.html"  authentication-failure-url="/login_error.html"/>
		<!-- 退出登录 -->
		<logout />
		<!--  关闭跨域请求伪造控制。因为静态页无法动态生成token,所以将此功能关闭。一般静态页采用图形验证码的方式实现防止跨域请求伪造的功能。-->
		<csrf  disabled="true" />
	</http>

	<!-- 认证管理器 -->
	<!-- <authentication-manager> 认证管理器 <authentication-provider> 认证的提供者,就是用来配置用户名和密码 
		<user-service> 用户的服务 <user /> 配置用户和密码 -->
	<authentication-manager>
		<authentication-provider   user-service-ref="userDetailsService">
			<!-- <user-service>
				name:用户名,password:用户密码 authorities:指定用户的角色
				<user name="admin"
					password="$2a$10$rIxa8dDL8F8Bf.TeC5rOeev96e0wTo0FIuLmtdJ6T/a8CptHlAlga"
					authorities="ROLE_ADMIN" />
			</user-service> -->

			<!-- 密码使用bcrypt加密 -->
			<password-encoder ref="bcryptEncoder" />
		</authentication-provider>
	</authentication-manager>

	<!-- bcrypt加密 -->
	<beans:bean id="bcryptEncoder"
		class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"></beans:bean>

	<beans:bean id="userDetailsService"  class="com.qingfeng.service.UserDetailsServiceImpl"></beans:bean>

</beans:beans>

  

 

4.UserDetailsServiceImpl.java类

package com.qingfeng.service;

import java.util.ArrayList;
import java.util.List;

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;

public class UserDetailsServiceImpl implements UserDetailsService {

	@Override
	public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
		//构建角色集合 ,项目中此处应该是根据用户名查询用户的角色列表
		List<GrantedAuthority> geAuthorities = new ArrayList<GrantedAuthority>();
		//添加角色ROLE_ADMIN
		geAuthorities.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
		/**
		 * 第一参数:username
		 * 第二参数:"$2a$10$rIxa8dDL8F8Bf.TeC5rOeev96e0wTo0FIuLmtdJ6T/a8CptHlAlga"是BCrypt加密的密码
		 * 第三参数:geAuthorities是它的角色
		 */
		return new User(username,"$2a$10$rIxa8dDL8F8Bf.TeC5rOeev96e0wTo0FIuLmtdJ6T/a8CptHlAlga",geAuthorities);
	}

}

  

5.编写登录login.html页面

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>

	<form action="/login" method="post">
		<table>
			<tr>
				<td>用户名
				<td />
				<td><input name="username" />
				<td />
			<tr />
			<tr>
				<td>密码
				<td />
				<td><input type="password" name="password" />
				<td />
			<tr />
		</table>
		<button>登录</button>
	</form>

</body>
</html>

  

6.编写登录login_error.html页面

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录错误</title>
</head>
<body>
<h1 >用户名和密码错误!</h1>
</body>
</html>

  

7.编写登录index.html页面

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>欢迎来到 SpringSecurity</title>
</head>
<body>
	<h1>欢迎来到 SpringSecurity</h1>
</body>
</html>

  

8.运行项目,输入http://localhost:9001/地址,用户随便填写,密码:123456

 

以上是关于springsecurity是否用了apache的shiro呀的主要内容,如果未能解决你的问题,请参考以下文章

springsecurity+thymeleaf的整合

Apache Shiro 与 Spring Security

用的挺顺手的 Spring Security 配置类,居然就要被官方弃用了?

Spring Security教程

web应用安全框架选型:Spring Security与Apache Shiro

与 Spring Security/Apache Shiro 相比,JAAS 的缺点是啥?