spring security框架入门
2018-12-01 16:32
176 查看
Spring Security概念
它是一个功能强大,且可自定义的身份验证和访问控制框架.
安全包括两个主要操作:
- “认证”,是为用户建立一个他所声明的主体。主体一般式指用户,设备或可以在你系统中执行动作的其他系统。
- “授权”指的是一个用户能否在你的应用中执行某个操作,在到达授权判断之前,身份的主体已经由 身份验证过程建立了。
实现步骤
- 在maven工程中导入依赖
<dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-web</artifactId> <version>${spring.security.version}</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-config</artifactId> <version>${spring.security.version}</version> </dependency>
2.在web.xml中配置监听器,加载resources下的Spring-security.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> <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> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list>
3.resources下的配置,对一个登录用户的用户名和密码进行检查,在获取其权限,判断其是否可以对资源进行访问
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:security="http://www.springframework.org/schema/security" 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"> <!-- 配置不过滤的资源(静态资源及登录相关) --> <security:http security="none" pattern="/login.html" /> <security:http security="none" pattern="/failer.html" /> <!--auto-config :遗留属性,可自动注册登录表单,BASIC身份验证以及注销URL和注销服务。 如果未指定,则默认为“false”。 我们建议您避免使用它,而是明确配置您需要的服务 --> <!--user-expressions:允许在intercept-url中的'access'属性中使用表达式; 而不是传统的配置属性列表。 默认为'true'。 如果启用,则每个属性应包含一个布尔表达式。 如果表达式的计算结果为“true”,则将授予访问权限。--> <security:http auto-config="true" user-expressions="false" > <!-- 配置拦截路径对象,表示任意路径都需要ROLE_USER权限 --> <security:intercept-url pattern="/**" access="ROLE_USER" /> <!-- 自定义登陆页面,login-page 自定义登陆页面,对默认的登录界面进行了覆盖 authentication-failure-url 用户权限校验失败之后才会跳转到这个页面,如果数据库中没有这个用户则不会跳转到这个页面。 default-target-url 登陆成功后跳转的页面。 注:username-parameter password-parameter 默认即为username和password 也可以不用定义--> <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(Cross-site request forgery)跨站请求伪造,默认是开启的,这里关闭 --> <security:csrf disabled="true" /> </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> --> <!--这里通过查询数据,并对密码进行BCryptPasswordEncoder加密的方式,构造框架--> <!-- 切换成数据库中的用户名和密码 --> <security:authentication-manager> <security:authentication-provider user-service-ref="userService"> <!-- 配置加密的方式--> <security:password-encoder ref="passwordEncoder"/> </security:authentication-provider> </security:authentication-manager> <!-- 配置加密类 --> <bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>
4.按照 login-page的属性,新建一个登录页面/login.html,在里面建立的表单,其访问路径应为login-processing-url中的内容login,这样表单就会提交给上一步配置的过滤器,过滤器对其用户名,密码,访问权限进行判定
<!-login.html---> <form action="login" method="post"> <table> <tr> <td>姓名:</td> <td><input type="text" name="username" /></td> </tr> <tr> <td>密码:</td> <td><input type="password" name="password" /></td> </tr> <tr> <td colspan="2" align="center"><input type="submit" value="登录" /> <input type="reset" value="重置" /></td> </tr> </table> </form>
- 建立一个service bean,让它继承UserDetailsService(这是框架提交的一个接口,通过实现它的loadUserByUsername方法即可,对用户名和密码进行校验),这里值得注意的是,BCryptPasswordEncoder加密方式,会从数据库中找到已经被加密的密码,在得到其加密方式,对我们输入的明文密码再进行一次加密,输入和数据库中的密码,即可完成验证
@Service("userService") @Transactional public class UserServiceImpl implements IUserService { @Override public UserDetails loadUserByUsername (String username) throws UsernameNotFoundException { UserInfo userInfo = null; try { userInfo = userDao.findUserByName(username); } catch (Exception e) { e.printStackTrace(); } User user = new User(userInfo.getUsername(), userInfo.getPassword(), getAuthority(userInfo.getRoles())); return user; } public List<SimpleGrantedAuthority> getAuthority (List<Role> roles) { List<SimpleGrantedAuthority> list = new ArrayList<>(); for (Role role : roles) { list.add(new SimpleGrantedAuthority("ROLE_" + role.getRoleName().toUpperCase())); } return list; } }
相关文章推荐
- Spring Security --- 权限控制安全框架入门简介
- Spring Security(Spring安全框架)入门理解
- Spring Security框架入门
- Spring Security安全框架入门篇
- Spring Security安全框架入门篇
- Spring Security安全框架入门篇
- Spring Security安全框架入门篇
- Spring Security安全框架入门篇
- Spring Security框架入门
- Spring security 框架入门学习
- VS2010/MFC编程入门之二(利用MFC向导生成单文档应用程序框架)
- 2018年最新Python的人工智能深度学习框架Tensorflow 入门教程+源码
- [Python]网络爬虫(12):爬虫框架Scrapy的第一个爬虫示例入门教程
- R语言Web开发框架shiny包快速入门
- Volly框架(一):简单入门(2)——加载图片
- 技术管理从入门到提高:RRR技术管理框架
- 千峰最新PHP异步通信框架Swoole重入门到实战视频教程
- DWR3.0框架入门(3) —— ScriptSession的维护及优化
- 【前端】Bootstrap框架入门
- Farseer.net轻量级开源框架 入门篇:普通逻辑层