【Spring】- 如何认识Spring Security

1. 是什么?

  • Spring Security是Spring项目组中用来提供安全认证服务的框架
  • 是一个轻量级的安全框架,它确保基于Spring的应用程序提供身份验证和授权支持;它与Spring MVC有很好地集成,并配备了流行的安全算法实现捆绑在一起

2、安全操作:

认证

  • 认证:为用户建立一个他所声明的主题,主体一般指用户,设备可以在你的系统

授权

  • 授权指的是一个用户能否在你的应用中执行某个操作,在到达授权判断之前,身份的主题已经由身份验证的过程建立;

3. 入门操作

  1. 导入依赖
<dependencies>
	<dependency>
		<groupId>org.springframework.security</groupId>
		<artifactId>spring-security-web</artifactId>
		<version>5.0.1.RELEASE</version>
	</dependency>
	<dependency>
		<groupId>org.springframework.security</groupId>
		<artifactId>spring-security-config</artifactId>
		<version>5.0.1.RELEASE</version>
	</dependency>
</dependencies>
  1. Web.xml中创建filter
<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-name必须是springSecurityFilterChain -->
<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>
  1. 为什么DelegatingFilterProxy的filter-name必须是springSecurityFilterChain,下一篇博客继续了解;
  2. 配置文件-Spring-Security.xml
// auto-config="true",Spring Security会自动生成登录表单
<security:http auto-config="true" use-expressions="false">
	<!-- 配置资料连接,表示任意路径都需要ROLE_USER权限 -->
	<security:intercept-url pattern="/**" access="ROLE_USER" />
</security:http>
<security:authentication-manager>
	<security:authentication-provider>
		<security:user-service>
			<security:user name="user" password="{noop}user"
			authorities="ROLE_USER" />
			<security:user name="admin" password="{noop}admin"
			authorities="ROLE_ADMIN" />
		</security:user-service>
	</security:authentication-provider>
</security:authentication-manager>
  • 注释说明
    在这里插入图片描述
  • access属性:默认配置应该是一个以逗号分隔的角色列表,请求的用户只需拥有其中的一个角色就能成功访问对应url;
  • 测试–设置http的auto-config=”true”时Spring Security自动生成的登录表单
    在这里插入图片描述

4、使用自定义页面配置

<!-- 配置不过滤的资源(静态资源及登录相关) -->
<security:http security="none" pattern="/login.html" />
<security:http security="none" pattern="/failer.html" />
<security:http auto-config="true" use-expressions="false">
	<security:intercept-url pattern="/**" access="ROLE_USER" />
	// 自定义登陆页面,login-page 自定义登陆页面 
	<security:form-login login-page="/login.html"
	login-processing-url="/login" username-parameter="username"
	password-parameter="password" authentication-failure-url="/failer.html"
	default-target-url="/success.html"/>
	/* 关闭CSRF-(跨站请求伪造,俗称跨域保护),默认是开启的 */
	<security:csrf disabled="true" />
</security:http>
  • authentication-failure-url 用户权限校验失败之后才会跳转到这个页面,如果数据库中没有这个用户则不会跳转到这个页面
  • default-target-url 登陆成功后跳转的页面
  • 注:登陆页面用户名固定 username,密码password,action:login

5、退出登录

属性作用
invalidate-session退出登录后是否删除session,默认为true
logout-url退出的连接
logout-successurl成功退出登录后重定向的URL
  • 注:登出操作 只需要链接到 logout即可登出当前用户,即退出登录;
/* 登出, invalidate-session 是否删除session 
	logout-url:登出处理链接 logout-successurl:登出成功页面
	注:登出操作 只需要链接到 logout即可登出当前用户*/
<security:logout invalidate-session="true" logout-url="/logout" logout-success-url="/login.jsp" />

6、使用数据库认证

系统登录用户有很多,在配置文件中进行的单一配置是没有办法满足我们的需求的,这时候就需要跟我们的数据库联系起来啦,此处使用的是UserDetails、UserDetailsService进行的操作;

接口介绍

UserDetails

UserDetails是Spring Security提供的一个接口,封装当前进行认证的用户信息,我们可以自己对其实现,也可以使用Spring security提供的UserDetails的实现类User来实现

public interface UserDetails extends Serializable {
	Collection<? extends GrantedAuthority> getAuthorities();
	String getPassword();
	String getUsername();
	boolean isAccountNonExpired();
	boolean isAccountNonLocked();
	boolean isCredentialsNonExpired();
	boolean isEnabled();
}
  • User类的部分代码
public class User implements UserDetails, CredentialsContainer {
	private String password;
	private final String username;
	private final Set<GrantedAuthority> authorities;
	private final boolean accountNonExpired; //帐户是否过期
	private final boolean accountNonLocked; //帐户是否锁定
	private final boolean credentialsNonExpired; //认证是否过期
	private final boolean enabled; //帐户是否可用

UserDetailsService

public interface UserDetailsService {
	UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
}

应用实战

xml配置,代码编写实现

  • Spring-security.xml的配置
<!-- 认证器-切换成数据库中的用户名和密码 -->
<security:authentication-manager>
	<security:authentication-provider user-service-ref="userService"></security:authentication-provider>
</security:authentication-manager>
  • Service
public interface IUserService extends UserDetailsService{
}
  • UserServiceImpl层
@Service("userService")
@Transactional
public class UserServiceImpl implements IUserService {
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        UserInfo userInfo = null;
        try {
            userInfo = userDao.findByUsername(username);
        } catch (Exception e) {
            e.printStackTrace();
        }
        //处理自己的用户对象封装成UserDetails
        User user = new User(userInfo.getUsername(), userInfo.getPassword(),
                userInfo.getStatus() == 0 ? false : true, true,
                true, true, getAuthority(userInfo.getRoles()));
        return user;
    }

    //作用就是返回一个List集合(集合中是角色描述信息)
    public List<SimpleGrantedAuthority> getAuthority(List<Role> roles) {
        List<SimpleGrantedAuthority> list = new ArrayList<>();
        for (Role role : roles) {
            list.add(new SimpleGrantedAuthority("ROLE_" + role.getRoleName()));
        }
        return list;
    }
}

对于Spring Security的基础认识与实践,操作过程的认识与理解的记录总结;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值