南京公共工程建设中心网站,小程序商城有哪些平台,物流网站怎么做的,旅游网站作用Spring Security 使用数据库认证 在 Spring Security 中如果想要使用数据进行认证操作#xff0c;有很多种操作方式#xff0c;这里我们介绍使用 UserDetails 、 UserDetailsService来完成操作。 UserDetails
public interface UserDetails extends Serializable {
Collecti…Spring Security 使用数据库认证 在 Spring Security 中如果想要使用数据进行认证操作有很多种操作方式这里我们介绍使用 UserDetails 、 UserDetailsService来完成操作。 UserDetails
public interface UserDetails extends Serializable {
Collection? extends GrantedAuthority getAuthorities();
String getPassword();
String getUsername();
boolean isAccountNonExpired();
boolean isAccountNonLocked();
boolean isCredentialsNonExpired();
boolean isEnabled();
}
UserDetails 是一个接口我们可以认为 UserDetails 作用是于封装当前进行认证的用户信息但由于其是一个接口所以我们可以对其进行实现也可以使用Spring Security 提供的一个 UserDetails 的实现类 User 来完成操作 以下是 User 类的部分代码
public class User implements UserDetails, CredentialsContainer {
private String password;
private final String username;
private final SetGrantedAuthority 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;
}
面将 UserDetails 与 UserDetailsService 做了一个简单的介绍那么我们具体如何完成 Spring Security 的数据库认证操作哪我们通过用户管理中用户登录来完成Spring Security 的认证操作。 3. 用户管理 3.1 用户登录 spring-security.xml
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:securityhttp://www.springframework.org/schema/securityxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/securityhttp://www.springframework.org/schema/security/spring-security.xsd!-- 配置不拦截的资源 --security:http pattern/login.jsp securitynone/security:http pattern/failer.jsp securitynone/security:http pattern/css/** securitynone/security:http pattern/img/** securitynone/security:http pattern/plugins/** securitynone/!--配置具体的规则auto-configtrue 不用自己编写登录的页面框架提供默认登录页面use-expressionsfalse 是否使用SPEL表达式没学习过--security:http auto-configtrue use-expressionstrue!-- 配置具体的拦截的规则 pattern请求路径的规则 access访问系统的人必须有ROLE_USER的角色 --security:intercept-url pattern/** accesshasAnyRole(ROLE_USER,ROLE_ADMIN)/!-- 定义跳转的具体的页面 --security:form-loginlogin-page/login.jsplogin-processing-url/login.dodefault-target-url/index.jspauthentication-failure-url/failer.jspauthentication-success-forward-url/pages/main.jsp/!-- 关闭跨域请求 --security:csrf disabledtrue/!-- 退出 --security:logout invalidate-sessiontrue logout-url/logout.do logout-success-url/login.jsp //security:http!-- 切换成数据库中的用户名和密码 --security:authentication-managersecurity:authentication-provider user-service-refuserService!-- 配置加密的方式security:password-encoder refpasswordEncoder/--security:password-encoder refpasswordEncoder//security:authentication-provider/security:authentication-manager!-- 配置加密类 --bean idpasswordEncoder classorg.springframework.security.crypto.bcrypt.BCryptPasswordEncoder/!-- 提供了入门的方式在内存中存入用户名和密码security:authentication-managersecurity:authentication-providersecurity:user-servicesecurity:user nameadmin password{noop}admin authoritiesROLE_USER//security:user-service/security:authentication-provider/security:authentication-manager--security:global-method-security pre-post-annotationsenabled jsr250-annotationsenabled secured-annotationsenabled/security:global-method-security/beans
导入依赖 dependencygroupIdorg.springframework.security/groupIdartifactIdspring-security-web/artifactIdversion${spring.security.version}/version/dependencydependencygroupIdorg.springframework.security/groupIdartifactIdspring-security-config/artifactIdversion${spring.security.version}/version/dependencydependencygroupIdorg.springframework.security/groupIdartifactIdspring-security-core/artifactIdversion${spring.security.version}/version/dependencydependencygroupIdorg.springframework.security/groupIdartifactIdspring-security-taglibs/artifactIdversion${spring.security.version}/version/dependency
配置web.xml !-- 配置加载类路径的配置文件 --context-paramparam-namecontextConfigLocation/param-nameparam-valueclasspath*:applicationContext.xml,classpath*:spring-security.xml/param-value/context-paramfilterfilter-namespringSecurityFilterChain/filter-namefilter-classorg.springframework.web.filter.DelegatingFilterProxy/filter-class/filterfilter-mappingfilter-namespringSecurityFilterChain/filter-nameurl-pattern/*/url-pattern/filter-mapping3.1.1. 登录页面 login.jsp
% page languagejava contentTypetext/html; charsetUTF-8pageEncodingUTF-8%
!DOCTYPE html PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN http://www.w3.org/TR/html4/loose.dtd
html
head
meta charsetutf-8
meta http-equivX-UA-Compatible contentIEedgetitle数据 - AdminLTE2定制版 | Log in/titlemetacontentwidthdevice-width,initial-scale1,maximum-scale1,user-scalablenonameviewportlink relstylesheethref${pageContext.request.contextPath}/plugins/bootstrap/css/bootstrap.min.css
link relstylesheethref${pageContext.request.contextPath}/plugins/font-awesome/css/font-awesome.min.css
link relstylesheethref${pageContext.request.contextPath}/plugins/ionicons/css/ionicons.min.css
link relstylesheethref${pageContext.request.contextPath}/plugins/adminLTE/css/AdminLTE.css
link relstylesheethref${pageContext.request.contextPath}/plugins/iCheck/square/blue.css
/headbody classhold-transition login-pagediv classlogin-boxdiv classlogin-logoa hrefall-admin-index.htmlbITCAST/b后台管理系统/a/div!-- /.login-logo --div classlogin-box-bodyp classlogin-box-msg登录系统/pform action${pageContext.request.contextPath}/login.do methodpostdiv classform-group has-feedbackinput typetext nameusername classform-controlplaceholder用户名 spanclassglyphicon glyphicon-envelope form-control-feedback/span/divdiv classform-group has-feedbackinput typepassword namepassword classform-controlplaceholder密码 spanclassglyphicon glyphicon-lock form-control-feedback/span/divdiv classrowdiv classcol-xs-8div classcheckbox ichecklabelinput typecheckbox 记住 下次自动登录/label/div/div!-- /.col --div classcol-xs-4button typesubmit classbtn btn-primary btn-block btn-flat登录/button/div!-- /.col --/div/forma href#忘记密码/abr/div!-- /.login-box-body --/div!-- /.login-box --!-- jQuery 2.2.3 --!-- Bootstrap 3.3.6 --!-- iCheck --scriptsrc${pageContext.request.contextPath}/plugins/jQuery/jquery-2.2.3.min.js/scriptscriptsrc${pageContext.request.contextPath}/plugins/bootstrap/js/bootstrap.min.js/scriptscriptsrc${pageContext.request.contextPath}/plugins/iCheck/icheck.min.js/scriptscript$(function() {$(input).iCheck({checkboxClass : icheckbox_square-blue,radioClass : iradio_square-blue,increaseArea : 20% // optional});});/script
/body/html
UserInfo
package com.itheima.ssm.domain;import java.util.List;//与数据库中users对应
public class UserInfo {private String id;private String username;private String email;private String password;private String phoneNum;private int status;private String statusStr;private ListRole roles;public String getId() {return id;}public void setId(String id) {this.id id;}public String getUsername() {return username;}public void setUsername(String username) {this.username username;}public String getEmail() {return email;}public void setEmail(String email) {this.email email;}public String getPassword() {return password;}public void setPassword(String password) {this.password password;}public String getPhoneNum() {return phoneNum;}public void setPhoneNum(String phoneNum) {this.phoneNum phoneNum;}public int getStatus() {return status;}public void setStatus(int status) {this.status status;}public String getStatusStr() {//状态0 未开启 1 开启if (status 0) {statusStr 未开启;} else if (status 1) {statusStr 开启;}return statusStr;}public void setStatusStr(String statusStr) {this.statusStr statusStr;}public ListRole getRoles() {return roles;}public void setRoles(ListRole roles) {this.roles roles;}
}
3.1.2.UserServiceImpl
public interface IUserService extends UserDetailsService{
} package com.itheima.ssm.service.impl;Service(userService)
Transactional
public class UserServiceImpl implements IUserService {Autowiredprivate IUserDao userDao;Autowiredprivate BCryptPasswordEncoder bCryptPasswordEncoder;Overridepublic UserInfo findById(String id) throws Exception {return userDao.findById(id);}Overridepublic void addRoleToUser(String userId, String[] roleIds) throws Exception {for(String roleId:roleIds){userDao.addRoleToUser(userId,roleId);}}Overridepublic ListRole findOtherRoles(String userid) throws Exception {return userDao.findOtherRoles(userid);}Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {System.out.println(username);UserInfo userInfo null;try {userInfo userDao.findByUsername(username);
// System.out.println(username);
// System.out.println(userInfo.toString());} catch (Exception e) {e.printStackTrace();}//处理自己的用户对象封装成UserDetailsUser user new User(userInfo.getUsername(), userInfo.getPassword(), userInfo.getStatus() 0 ? false : true, true, true, true, getAuthority(userInfo.getRoles()));return user;}//作用就是返回一个List集合集合中装入的是角色描述public ListSimpleGrantedAuthority getAuthority(ListRole roles) {ListSimpleGrantedAuthority list new ArrayList();for (Role role : roles) {list.add(new SimpleGrantedAuthority(ROLE_ role.getRoleName()));}return list;}Overridepublic ListUserInfo findAll() throws Exception{//userDao.findAll();return userDao.findAll();}Overridepublic void save(UserInfo userInfo)throws Exception {userInfo.setPassword(bCryptPasswordEncoder.encode(userInfo.getPassword()));userDao.save(userInfo);}}
3.1.3.IUserDao
public interface IUserDao {
Select(select * from user where id#{id})
public UserInfo findById(Long id) throws Exception;
Select(select * from user where username#{username})
Results({
Result(id true, property id, column id),
Result(column username, property username),
Result(column email, property email),
Result(column password, property password),
Result(column phoneNum, property phoneNum),
Result(column status, property status),
Result(column id, property roles, javaType List.class, many
Many(select com.itheima.ssm.dao.IRoleDao.findRoleByUserId)) })
public UserInfo findByUsername(String username);
}
IRoleDao
public interface IRoleDao {//根据用户id查询出所有对应的角色Select(select * from role where id in (select roleId from users_role where userId#{userId}))public ListRole findRoleByUserId(String userId) throws Exception;
}3.2 用户退出 使用 spring security 完成用户退出非常简单 配置
security:logout invalidate-sessiontrue logout-url/logout.do logout-successurl/login.jsp /
在header.jsp修改
a href${pageContext.request.contextPath}/logout.do
classbtn btn-default btn-flat注销/a
文章转载自: http://www.morning.ndngj.cn.gov.cn.ndngj.cn http://www.morning.nwqyq.cn.gov.cn.nwqyq.cn http://www.morning.kdrly.cn.gov.cn.kdrly.cn http://www.morning.dndk.cn.gov.cn.dndk.cn http://www.morning.rgtp.cn.gov.cn.rgtp.cn http://www.morning.qqfcf.cn.gov.cn.qqfcf.cn http://www.morning.qpsxz.cn.gov.cn.qpsxz.cn http://www.morning.bypfj.cn.gov.cn.bypfj.cn http://www.morning.jqsyp.cn.gov.cn.jqsyp.cn http://www.morning.wjndl.cn.gov.cn.wjndl.cn http://www.morning.bzbq.cn.gov.cn.bzbq.cn http://www.morning.xrsqb.cn.gov.cn.xrsqb.cn http://www.morning.fewhope.com.gov.cn.fewhope.com http://www.morning.krgjc.cn.gov.cn.krgjc.cn http://www.morning.bpmtq.cn.gov.cn.bpmtq.cn http://www.morning.qbmjf.cn.gov.cn.qbmjf.cn http://www.morning.xckrj.cn.gov.cn.xckrj.cn http://www.morning.sxjmz.cn.gov.cn.sxjmz.cn http://www.morning.ntzfj.cn.gov.cn.ntzfj.cn http://www.morning.dpfr.cn.gov.cn.dpfr.cn http://www.morning.nnttr.cn.gov.cn.nnttr.cn http://www.morning.bxch.cn.gov.cn.bxch.cn http://www.morning.qfwfj.cn.gov.cn.qfwfj.cn http://www.morning.dplmq.cn.gov.cn.dplmq.cn http://www.morning.rcwbc.cn.gov.cn.rcwbc.cn http://www.morning.qkdcb.cn.gov.cn.qkdcb.cn http://www.morning.wnhsw.cn.gov.cn.wnhsw.cn http://www.morning.gtylt.cn.gov.cn.gtylt.cn http://www.morning.qqrqb.cn.gov.cn.qqrqb.cn http://www.morning.ybmp.cn.gov.cn.ybmp.cn http://www.morning.rynrn.cn.gov.cn.rynrn.cn http://www.morning.ffydh.cn.gov.cn.ffydh.cn http://www.morning.fkgct.cn.gov.cn.fkgct.cn http://www.morning.hjjkz.cn.gov.cn.hjjkz.cn http://www.morning.zztmk.cn.gov.cn.zztmk.cn http://www.morning.mnwb.cn.gov.cn.mnwb.cn http://www.morning.wdprz.cn.gov.cn.wdprz.cn http://www.morning.cjxqx.cn.gov.cn.cjxqx.cn http://www.morning.lzqdd.cn.gov.cn.lzqdd.cn http://www.morning.czxrg.cn.gov.cn.czxrg.cn http://www.morning.bynf.cn.gov.cn.bynf.cn http://www.morning.ptqbt.cn.gov.cn.ptqbt.cn http://www.morning.lbrrn.cn.gov.cn.lbrrn.cn http://www.morning.qqhersx.com.gov.cn.qqhersx.com http://www.morning.pqwhk.cn.gov.cn.pqwhk.cn http://www.morning.vvdifactory.com.gov.cn.vvdifactory.com http://www.morning.lflnb.cn.gov.cn.lflnb.cn http://www.morning.rshijie.com.gov.cn.rshijie.com http://www.morning.ghrlx.cn.gov.cn.ghrlx.cn http://www.morning.jfch.cn.gov.cn.jfch.cn http://www.morning.zpdjh.cn.gov.cn.zpdjh.cn http://www.morning.rshs.cn.gov.cn.rshs.cn http://www.morning.wrtw.cn.gov.cn.wrtw.cn http://www.morning.cfcpb.cn.gov.cn.cfcpb.cn http://www.morning.nqwkn.cn.gov.cn.nqwkn.cn http://www.morning.dnjwm.cn.gov.cn.dnjwm.cn http://www.morning.tkjh.cn.gov.cn.tkjh.cn http://www.morning.jbnss.cn.gov.cn.jbnss.cn http://www.morning.ntqgz.cn.gov.cn.ntqgz.cn http://www.morning.lkmks.cn.gov.cn.lkmks.cn http://www.morning.pzrpz.cn.gov.cn.pzrpz.cn http://www.morning.xbmwh.cn.gov.cn.xbmwh.cn http://www.morning.lqypx.cn.gov.cn.lqypx.cn http://www.morning.glcgy.cn.gov.cn.glcgy.cn http://www.morning.nkmw.cn.gov.cn.nkmw.cn http://www.morning.wktbz.cn.gov.cn.wktbz.cn http://www.morning.rrbhy.cn.gov.cn.rrbhy.cn http://www.morning.wnkbf.cn.gov.cn.wnkbf.cn http://www.morning.czcbl.cn.gov.cn.czcbl.cn http://www.morning.hytqt.cn.gov.cn.hytqt.cn http://www.morning.lmyq.cn.gov.cn.lmyq.cn http://www.morning.fldk.cn.gov.cn.fldk.cn http://www.morning.knlbg.cn.gov.cn.knlbg.cn http://www.morning.pbdnj.cn.gov.cn.pbdnj.cn http://www.morning.bsjxh.cn.gov.cn.bsjxh.cn http://www.morning.bslkt.cn.gov.cn.bslkt.cn http://www.morning.zxznh.cn.gov.cn.zxznh.cn http://www.morning.mfcbk.cn.gov.cn.mfcbk.cn http://www.morning.rfrxt.cn.gov.cn.rfrxt.cn http://www.morning.bkfdf.cn.gov.cn.bkfdf.cn