{"id":1690,"date":"2012-08-13T16:00:00","date_gmt":"2012-08-13T16:00:00","guid":{"rendered":"http:\/\/www.javacodegeeks.com\/2012\/10\/spring-security-implementing-custom-userdetails-with-hibernate.html"},"modified":"2012-10-22T06:30:36","modified_gmt":"2012-10-22T06:30:36","slug":"spring-security-implementing-custom","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2012\/08\/spring-security-implementing-custom.html","title":{"rendered":"Spring Security Implementing Custom UserDetails with Hibernate"},"content":{"rendered":"<div dir=\"ltr\" style=\"text-align: left\">Most of the time, we will want to configure our own security access roles in web applications. This is easily achieved in Spring Security. In this article we will see the most simple way to do this.<\/p>\n<p>First of all we will need the following tables in the database:<\/p>\n<pre class=\"brush:java\">CREATE TABLE IF NOT EXISTS `mydb`.`security_role` (\r\n\r\n`id` INT(11) NOT NULL AUTO_INCREMENT ,\r\n\r\n`name` VARCHAR(50) NULL DEFAULT NULL ,\r\n\r\nPRIMARY KEY (`id`) )\r\n\r\nENGINE = InnoDB\r\n\r\nAUTO_INCREMENT = 4\r\n\r\nDEFAULT CHARACTER SET = latin1;\r\n\r\nCREATE TABLE IF NOT EXISTS `mydb`.`user` (\r\n\r\n`id` INT(11) NOT NULL AUTO_INCREMENT ,\r\n\r\n`first_name` VARCHAR(45) NULL DEFAULT NULL ,\r\n\r\n`family_name` VARCHAR(45) NULL DEFAULT NULL ,\r\n\r\n`dob` DATE NULL DEFAULT NULL ,\r\n\r\n`password` VARCHAR(45) NOT NULL ,\r\n\r\n`username` VARCHAR(45) NOT NULL ,\r\n\r\n`confirm_password` VARCHAR(45) NOT NULL ,\r\n\r\n`active` TINYINT(1) NOT NULL ,\r\n\r\nPRIMARY KEY (`id`) ,\r\n\r\nUNIQUE INDEX `username` (`username` ASC) )\r\n\r\nENGINE = InnoDB\r\n\r\nAUTO_INCREMENT = 9\r\n\r\nDEFAULT CHARACTER SET = latin1;\r\n\r\nCREATE TABLE IF NOT EXISTS `mydb`.`user_security_role` (\r\n\r\n`user_id` INT(11) NOT NULL ,\r\n\r\n`security_role_id` INT(11) NOT NULL ,\r\n\r\nPRIMARY KEY (`user_id`, `security_role_id`) ,\r\n\r\nINDEX `security_role_id` (`security_role_id` ASC) ,\r\n\r\nCONSTRAINT `user_security_role_ibfk_1`\r\n\r\nFOREIGN KEY (`user_id` )\r\n\r\nREFERENCES `mydb`.`user` (`id` ),\r\n\r\nCONSTRAINT `user_security_role_ibfk_2`\r\n\r\nFOREIGN KEY (`security_role_id` )\r\n\r\nREFERENCES `mydb`.`security_role` (`id` ))\r\n\r\nENGINE = InnoDB\r\n\r\nDEFAULT CHARACTER SET = latin1;\r\n<\/pre>\n<p>Obviously, the table user will hold users, table security_role will hold security roles and user_security_roles will hold the association. In order for the implementation to be as simple as possible, entries inside the security_role table should always start with \u201cROLE_\u201d, otherwise we will need to encapsulate (this will NOT be covered in this article).        <\/p>\n<p>So we execute the following statements:<\/p>\n<pre class=\"brush:java\">insert into security_role(name) values ('ROLE_admin');\r\n\r\ninsert into security_role(name) values ('ROLE_Kennel_Owner');\r\n\r\ninsert into security_role(name) values ('ROLE_User');\r\n\r\ninsert into user (first_name,family_name,password,username,confirm_password,active)\r\n\r\nvalues ('ioannis','ntantis','123456','giannisapi','123456',1);\r\n\r\ninsert into user_security_role (user_id,security_role_id) values (1,1);<\/pre>\n<p>So after those commands we have the following:        <\/p>\n<p>Three different security roles        <\/p>\n<p>One user with username \u201cgiannisapi\u201d        <\/p>\n<p>We have give the role \u201cROLE_admin\u201d to user \u201cgiannisapi\u201d        <\/p>\n<p>Now that everything is completed on the database side, we will move to the java side to see what needs to be done.        <\/p>\n<p>First we will create the necessary DTO (there are various tools that will automatically generate DTO\u2019s from the database for you):<\/p>\n<pre class=\"brush:java\">package org.intan.pedigree.form;\r\n\r\nimport java.io.Serializable;\r\n\r\nimport java.util.Collection;\r\n\r\nimport java.util.Date;\r\n\r\nimport java.util.Set;\r\n\r\nimport javax.persistence.Basic;\r\n\r\nimport javax.persistence.Column;\r\n\r\nimport javax.persistence.Entity;\r\n\r\nimport javax.persistence.GeneratedValue;\r\n\r\nimport javax.persistence.GenerationType;\r\n\r\nimport javax.persistence.Id;\r\n\r\nimport javax.persistence.JoinColumn;\r\n\r\nimport javax.persistence.JoinTable;\r\n\r\nimport javax.persistence.ManyToMany;\r\n\r\nimport javax.persistence.NamedQueries;\r\n\r\nimport javax.persistence.NamedQuery;\r\n\r\nimport javax.persistence.Table;\r\n\r\nimport javax.persistence.Temporal;\r\n\r\nimport javax.persistence.TemporalType;\r\n\r\n\/**\r\n\r\n*\r\n\r\n* @author intan\r\n\r\n*\/\r\n\r\n@Entity\r\n\r\n@Table(name = 'user', catalog = 'mydb', schema = '')\r\n\r\n@NamedQueries({\r\n\r\n@NamedQuery(name = 'UserEntity.findAll', query = 'SELECT u FROM UserEntity u'),\r\n\r\n@NamedQuery(name = 'UserEntity.findById', query = 'SELECT u FROM UserEntity u WHERE u.id = :id'),\r\n\r\n@NamedQuery(name = 'UserEntity.findByFirstName', query = 'SELECT u FROM UserEntity u WHERE u.firstName = :firstName'),\r\n\r\n@NamedQuery(name = 'UserEntity.findByFamilyName', query = 'SELECT u FROM UserEntity u WHERE u.familyName = :familyName'),\r\n\r\n@NamedQuery(name = 'UserEntity.findByDob', query = 'SELECT u FROM UserEntity u WHERE u.dob = :dob'),\r\n\r\n@NamedQuery(name = 'UserEntity.findByPassword', query = 'SELECT u FROM UserEntity u WHERE u.password = :password'),\r\n\r\n@NamedQuery(name = 'UserEntity.findByUsername', query = 'SELECT u FROM UserEntity u WHERE u.username = :username'),\r\n\r\n@NamedQuery(name = 'UserEntity.findByConfirmPassword', query = 'SELECT u FROM UserEntity u WHERE u.confirmPassword = :confirmPassword'),\r\n\r\n@NamedQuery(name = 'UserEntity.findByActive', query = 'SELECT u FROM UserEntity u WHERE u.active = :active')})\r\n\r\npublic class UserEntity implements Serializable {\r\n\r\nprivate static final long serialVersionUID = 1L;\r\n\r\n@Id\r\n\r\n@GeneratedValue(strategy = GenerationType.IDENTITY)\r\n\r\n@Basic(optional = false)\r\n\r\n@Column(name = 'id')\r\n\r\nprivate Integer id;\r\n\r\n@Column(name = 'first_name')\r\n\r\nprivate String firstName;\r\n\r\n@Column(name = 'family_name')\r\n\r\nprivate String familyName;\r\n\r\n@Column(name = 'dob')\r\n\r\n@Temporal(TemporalType.DATE)\r\n\r\nprivate Date dob;\r\n\r\n@Basic(optional = false)\r\n\r\n@Column(name = 'password')\r\n\r\nprivate String password;\r\n\r\n@Basic(optional = false)\r\n\r\n@Column(name = 'username')\r\n\r\nprivate String username;\r\n\r\n@Basic(optional = false)\r\n\r\n@Column(name = 'confirm_password')\r\n\r\nprivate String confirmPassword;\r\n\r\n@Basic(optional = false)\r\n\r\n@Column(name = 'active')\r\n\r\nprivate boolean active;\r\n\r\n@JoinTable(name = 'user_security_role', joinColumns = {\r\n\r\n@JoinColumn(name = 'user_id', referencedColumnName = 'id')}, inverseJoinColumns = {\r\n\r\n@JoinColumn(name = 'security_role_id', referencedColumnName = 'id')})\r\n\r\n@ManyToMany\r\n\r\nprivate Set securityRoleCollection;\r\n\r\npublic UserEntity() {\r\n\r\n}\r\n\r\npublic UserEntity(Integer id) {\r\n\r\nthis.id = id;\r\n\r\n}\r\n\r\npublic UserEntity(Integer id, String password, String username, String confirmPassword, boolean active) {\r\n\r\nthis.id = id;\r\n\r\nthis.password = password;\r\n\r\nthis.username = username;\r\n\r\nthis.confirmPassword = confirmPassword;\r\n\r\nthis.active = active;\r\n\r\n}\r\n\r\npublic Integer getId() {\r\n\r\nreturn id;\r\n\r\n}\r\n\r\npublic void setId(Integer id) {\r\n\r\nthis.id = id;\r\n\r\n}\r\n\r\npublic String getFirstName() {\r\n\r\nreturn firstName;\r\n\r\n}\r\n\r\npublic void setFirstName(String firstName) {\r\n\r\nthis.firstName = firstName;\r\n\r\n}\r\n\r\npublic String getFamilyName() {\r\n\r\nreturn familyName;\r\n\r\n}\r\n\r\npublic void setFamilyName(String familyName) {\r\n\r\nthis.familyName = familyName;\r\n\r\n}\r\n\r\npublic Date getDob() {\r\n\r\nreturn dob;\r\n\r\n}\r\n\r\npublic void setDob(Date dob) {\r\n\r\nthis.dob = dob;\r\n\r\n}\r\n\r\npublic String getPassword() {\r\n\r\nreturn password;\r\n\r\n}\r\n\r\npublic void setPassword(String password) {\r\n\r\nthis.password = password;\r\n\r\n}\r\n\r\npublic String getUsername() {\r\n\r\nreturn username;\r\n\r\n}\r\n\r\npublic void setUsername(String username) {\r\n\r\nthis.username = username;\r\n\r\n}\r\n\r\npublic String getConfirmPassword() {\r\n\r\nreturn confirmPassword;\r\n\r\n}\r\n\r\npublic void setConfirmPassword(String confirmPassword) {\r\n\r\nthis.confirmPassword = confirmPassword;\r\n\r\n}\r\n\r\npublic boolean getActive() {\r\n\r\nreturn active;\r\n\r\n}\r\n\r\npublic void setActive(boolean active) {\r\n\r\nthis.active = active;\r\n\r\n}\r\n\r\npublic Set getSecurityRoleCollection() {\r\n\r\nreturn securityRoleCollection;\r\n\r\n}\r\n\r\npublic void setSecurityRoleCollection(Set securityRoleCollection) {\r\n\r\nthis.securityRoleCollection = securityRoleCollection;\r\n\r\n}\r\n\r\n@Override\r\n\r\npublic int hashCode() {\r\n\r\nint hash = 0;\r\n\r\nhash += (id != null ? id.hashCode() : 0);\r\n\r\nreturn hash;\r\n\r\n}\r\n\r\n@Override\r\n\r\npublic boolean equals(Object object) {\r\n\r\n\/\/ TODO: Warning - this method won't work in the case the id fields are not set\r\n\r\nif (!(object instanceof UserEntity)) {\r\n\r\nreturn false;\r\n\r\n}\r\n\r\nUserEntity other = (UserEntity) object;\r\n\r\nif ((this.id == null &amp;&amp; other.id != null) || (this.id != null &amp;&amp; !this.id.equals(other.id))) {\r\n\r\nreturn false;\r\n\r\n}\r\n\r\nreturn true;\r\n\r\n}\r\n\r\n@Override\r\n\r\npublic String toString() {\r\n\r\nreturn 'org.intan.pedigree.form.User[id=' + id + ']';\r\n\r\n}\r\n\r\n}<\/pre>\n<pre class=\"brush:java\">package org.intan.pedigree.form;\r\n\r\nimport java.io.Serializable;\r\n\r\nimport java.util.Collection;\r\n\r\nimport javax.persistence.Basic;\r\n\r\nimport javax.persistence.Column;\r\n\r\nimport javax.persistence.Entity;\r\n\r\nimport javax.persistence.GeneratedValue;\r\n\r\nimport javax.persistence.GenerationType;\r\n\r\nimport javax.persistence.Id;\r\n\r\nimport javax.persistence.ManyToMany;\r\n\r\nimport javax.persistence.NamedQueries;\r\n\r\nimport javax.persistence.NamedQuery;\r\n\r\nimport javax.persistence.Table;\r\n\r\n\/**\r\n\r\n*\r\n\r\n* @author intan\r\n\r\n*\/\r\n\r\n@Entity\r\n\r\n@Table(name = 'security_role', catalog = 'mydb', schema = '')\r\n\r\n@NamedQueries({\r\n\r\n@NamedQuery(name = 'SecurityRoleEntity.findAll', query = 'SELECT s FROM SecurityRoleEntity s'),\r\n\r\n@NamedQuery(name = 'SecurityRoleEntity.findById', query = 'SELECT s FROM SecurityRoleEntity s WHERE s.id = :id'),\r\n\r\n@NamedQuery(name = 'SecurityRoleEntity.findByName', query = 'SELECT s FROM SecurityRoleEntity s WHERE s.name = :name')})\r\n\r\npublic class SecurityRoleEntity implements Serializable {\r\n\r\nprivate static final long serialVersionUID = 1L;\r\n\r\n@Id\r\n\r\n@GeneratedValue(strategy = GenerationType.IDENTITY)\r\n\r\n@Basic(optional = false)\r\n\r\n@Column(name = 'id')\r\n\r\nprivate Integer id;\r\n\r\n@Column(name = 'name')\r\n\r\nprivate String name;\r\n\r\n@ManyToMany(mappedBy = 'securityRoleCollection')\r\n\r\nprivate Collection userCollection;\r\n\r\npublic SecurityRoleEntity() {\r\n\r\n}\r\n\r\npublic SecurityRoleEntity(Integer id) {\r\n\r\nthis.id = id;\r\n\r\n}\r\n\r\npublic Integer getId() {\r\n\r\nreturn id;\r\n\r\n}\r\n\r\npublic void setId(Integer id) {\r\n\r\nthis.id = id;\r\n\r\n}\r\n\r\npublic String getName() {\r\n\r\nreturn name;\r\n\r\n}\r\n\r\npublic void setName(String name) {\r\n\r\nthis.name = name;\r\n\r\n}\r\n\r\npublic Collection getUserCollection() {\r\n\r\nreturn userCollection;\r\n\r\n}\r\n\r\npublic void setUserCollection(Collection userCollection) {\r\n\r\nthis.userCollection = userCollection;\r\n\r\n}\r\n\r\n@Override\r\n\r\npublic int hashCode() {\r\n\r\nint hash = 0;\r\n\r\nhash += (id != null ? id.hashCode() : 0);\r\n\r\nreturn hash;\r\n\r\n}\r\n\r\n@Override\r\n\r\npublic boolean equals(Object object) {\r\n\r\n\/\/ TODO: Warning - this method won't work in the case the id fields are not set\r\n\r\nif (!(object instanceof SecurityRoleEntity)) {\r\n\r\nreturn false;\r\n\r\n}\r\n\r\nSecurityRoleEntity other = (SecurityRoleEntity) object;\r\n\r\nif ((this.id == null &amp;&amp; other.id != null) || (this.id != null &amp;&amp; !this.id.equals(other.id))) {\r\n\r\nreturn false;\r\n\r\n}\r\n\r\nreturn true;\r\n\r\n}\r\n\r\n@Override\r\n\r\npublic String toString() {\r\n\r\nreturn 'org.intan.pedigree.form.SecurityRole[id=' + id + ']';\r\n\r\n}\r\n\r\n}\r\n<\/pre>\n<p>Now that we have out DTO lets created the necessary DAO classes: <div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<pre class=\"brush:java\">package org.intan.pedigree.dao;\r\n\r\nimport java.util.List;\r\n\r\nimport java.util.Set;\r\n\r\nimport org.hibernate.SessionFactory;\r\n\r\nimport org.intan.pedigree.form.SecurityRoleEntity;\r\n\r\nimport org.intan.pedigree.form.UserEntity;\r\n\r\nimport org.springframework.beans.factory.annotation.Autowired;\r\n\r\nimport org.springframework.stereotype.Repository;\r\n\r\n@Repository\r\n\r\npublic class UserEntityDAOImpl implements UserEntityDAO{\r\n\r\n@Autowired\r\n\r\nprivate SessionFactory sessionFactory;\r\n\r\npublic void addUser(UserEntity user) {\r\n\r\ntry {\r\n\r\nsessionFactory.getCurrentSession().save(user);\r\n\r\n} catch (Exception e) {\r\n\r\nSystem.out.println(e);\r\n\r\n}\r\n\r\n}\r\n\r\npublic UserEntity findByName(String username) {\r\n\r\nUserEntity user = (UserEntity) sessionFactory.getCurrentSession().createQuery(\r\n\r\n'select u from UserEntity u where u.username = '' + username + ''').uniqueResult();\r\n\r\nreturn user;\r\n\r\n}\r\n\r\npublic UserEntity getUserByID(Integer id) {\r\n\r\nUserEntity user = (UserEntity) sessionFactory.getCurrentSession().createQuery(\r\n\r\n'select u from UserEntity u where id = '' + id + ''').uniqueResult();\r\n\r\nreturn user;\r\n\r\n}\r\n\r\npublic String activateUser(Integer id) {\r\n\r\nString hql = 'update UserEntityset active = :active where id = :id';\r\n\r\norg.hibernate.Query query = sessionFactory.getCurrentSession().createQuery(hql);\r\n\r\nquery.setString('active','Y');\r\n\r\nquery.setInteger('id',id);\r\n\r\nint rowCount = query.executeUpdate();\r\n\r\nSystem.out.println('Rows affected: ' + rowCount);\r\n\r\nreturn '';\r\n\r\n}\r\n\r\npublic String disableUser(Integer id) {\r\n\r\nString hql = 'update UserEntity set active = :active where id = :id';\r\n\r\norg.hibernate.Query query = sessionFactory.getCurrentSession().createQuery(hql);\r\n\r\nquery.setInteger('active',0);\r\n\r\nquery.setInteger('id',id);\r\n\r\nint rowCount = query.executeUpdate();\r\n\r\nSystem.out.println('Rows affected: ' + rowCount);\r\n\r\nreturn '';\r\n\r\n}\r\n\r\npublic void updateUser(UserEntity user) {\r\n\r\ntry {\r\n\r\nsessionFactory.getCurrentSession().update(user);\r\n\r\n} catch (Exception e) {\r\n\r\nSystem.out.println(e);\r\n\r\n}\r\n\r\n}\r\n\r\npublic List listUser() {\r\n\r\nreturn sessionFactory.getCurrentSession().createQuery('from UserEntity')\r\n\r\n.list();\r\n\r\n}\r\n\r\npublic void removeUser(Integer id) {\r\n\r\nUserEntity user = (UserEntity) sessionFactory.getCurrentSession().load(\r\n\r\nUserEntity.class, id);\r\n\r\nif (null != user) {\r\n\r\nsessionFactory.getCurrentSession().delete(user);\r\n\r\n}\r\n\r\n}\r\n\r\npublic Set getSecurityRolesForUsername(String username) {\r\n\r\nUserEntity user = (UserEntity) sessionFactory.getCurrentSession().createQuery(\r\n\r\n'select u from UserEntity u where u.username = '' + username + ''').uniqueResult();\r\n\r\nif (user!= null) {\r\n\r\nSet roles = (Set) user.getSecurityRoleCollection();\r\n\r\nif (roles != null &amp;&amp; roles.size() &gt; 0) {\r\n\r\nreturn roles;\r\n\r\n}\r\n\r\n}\r\n\r\nreturn null;\r\n\r\n}\r\n\r\n}<\/pre>\n<pre class=\"brush:java\">package org.intan.pedigree.dao;\r\n\r\nimport java.util.List;\r\n\r\nimport org.hibernate.Criteria;\r\n\r\nimport org.hibernate.SessionFactory;\r\n\r\nimport org.hibernate.criterion.Restrictions;\r\n\r\nimport org.intan.pedigree.form.Country;\r\n\r\nimport org.intan.pedigree.form.Kennel;\r\n\r\nimport org.intan.pedigree.form.SecurityRoleEntity;\r\n\r\nimport org.springframework.beans.factory.annotation.Autowired;\r\n\r\nimport org.springframework.stereotype.Repository;\r\n\r\n@Repository\r\n\r\npublic class SecurityRoleEntityDAOImpl implements SecurityRoleEntityDAO{\r\n\r\n@Autowired\r\n\r\nprivate SessionFactory sessionFactory;\r\n\r\npublic void addSecurityRoleEntity(SecurityRoleEntity securityRoleEntity) {\r\n\r\ntry {\r\n\r\nsessionFactory.getCurrentSession().save(securityRoleEntity);\r\n\r\n} catch (Exception e) {\r\n\r\nSystem.out.println(e);\r\n\r\n}\r\n\r\n}\r\n\r\npublic List listSecurityRoleEntity() {\r\n\r\nCriteria criteria = sessionFactory.getCurrentSession().createCriteria(SecurityRoleEntity.class);\r\n\r\ncriteria.add(Restrictions.ne('name','ROLE_ADMIN' ));\r\n\r\nreturn criteria.list();\r\n\r\n}\r\n\r\npublic SecurityRoleEntity getSecurityRoleEntityById(Integer id) {\r\n\r\nCriteria criteria = sessionFactory.getCurrentSession().createCriteria(SecurityRoleEntity.class);\r\n\r\ncriteria.add(Restrictions.eq('id',id));\r\n\r\nreturn (SecurityRoleEntity) criteria.uniqueResult();\r\n\r\n}\r\n\r\npublic void removeSecurityRoleEntity(Integer id) {\r\n\r\nSecurityRoleEntity securityRoleEntity = (SecurityRoleEntity) sessionFactory.getCurrentSession().load(\r\n\r\nSecurityRoleEntity.class, id);\r\n\r\nif (null != securityRoleEntity) {\r\n\r\nsessionFactory.getCurrentSession().delete(securityRoleEntity);\r\n\r\n}\r\n\r\n}\r\n\r\n}<\/pre>\n<p>Now we will create the service layer for the above DAO\u2019s.<\/p>\n<pre class=\"brush:java\">package org.intan.pedigree.service;\r\n\r\nimport java.util.List;\r\n\r\nimport org.intan.pedigree.dao.SecurityRoleEntityDAO;\r\n\r\nimport org.intan.pedigree.form.SecurityRoleEntity;\r\n\r\nimport org.springframework.beans.factory.annotation.Autowired;\r\n\r\nimport org.springframework.stereotype.Service;\r\n\r\nimport org.springframework.transaction.annotation.Transactional;\r\n\r\n@Service\r\n\r\npublic class SecurityRoleEntityServiceImpl implements SecurityRoleEntityService{\r\n\r\n@Autowired\r\n\r\nprivate SecurityRoleEntityDAO securityRoleEntityDAO;\r\n\r\n@Transactional\r\n\r\npublic void addSecurityRoleEntity(SecurityRoleEntity securityRoleEntity) {\r\n\r\nsecurityRoleEntityDAO.addSecurityRoleEntity(securityRoleEntity);\r\n\r\n}\r\n\r\n@Transactional\r\n\r\npublic List listSecurityRoleEntity() {\r\n\r\nreturn securityRoleEntityDAO.listSecurityRoleEntity();\r\n\r\n}\r\n\r\n@Transactional\r\n\r\npublic void removeSecurityRoleEntity(Integer id) {\r\n\r\nsecurityRoleEntityDAO.removeSecurityRoleEntity(id);\r\n\r\n}\r\n\r\n@Transactional\r\n\r\npublic SecurityRoleEntity getSecurityRoleEntityById(Integer id) {\r\n\r\nreturn securityRoleEntityDAO.getSecurityRoleEntityById( id);\r\n\r\n}\r\n\r\n}\r\n<\/pre>\n<p>In the Service layer of UserDetails below, pay attention that it implements UserDetailsService from org.springframework.security.core.userdetails.UserDetailsService.<\/p>\n<pre class=\"brush:java\">package org.intan.pedigree.service;\r\n\r\nimport org.intan.pedigree.dao.UserEntityDAO;\r\n\r\nimport org.intan.pedigree.dao.UserEntityDAO;\r\n\r\nimport org.intan.pedigree.form.UserEntity;\r\n\r\nimport org.springframework.beans.factory.annotation.Autowired;\r\n\r\nimport org.springframework.dao.DataAccessException;\r\n\r\nimport org.springframework.stereotype.Service;\r\n\r\nimport org.springframework.transaction.annotation.Transactional;\r\n\r\nimport org.springframework.security.core.userdetails.User;\r\n\r\nimport org.springframework.security.core.userdetails.UserDetails;\r\n\r\nimport org.springframework.security.core.userdetails.UserDetailsService;\r\n\r\nimport org.springframework.security.core.userdetails.UsernameNotFoundException;\r\n\r\n@Service('userDetailsService')\r\n\r\npublic class UserDetailsServiceImpl implements UserDetailsService {\r\n\r\n@Autowired\r\n\r\nprivate UserEntityDAO dao;\r\n\r\n@Autowired\r\n\r\nprivate Assembler assembler;\r\n\r\n@Transactional(readOnly = true)\r\n\r\npublic UserDetails loadUserByUsername(String username)\r\n\r\nthrows UsernameNotFoundException, DataAccessException {\r\n\r\nUserDetails userDetails = null;\r\n\r\nUserEntity userEntity = dao.findByName(username);\r\n\r\nif (userEntity == null)\r\n\r\nthrow new UsernameNotFoundException('user not found');\r\n\r\nreturn assembler.buildUserFromUserEntity(userEntity);\r\n\r\n}\r\n\r\n}<\/pre>\n<p>You also see above, that the loadUserByUsername methods return the result of the assembler.buildUserFromUserEntity . Simply put, what this method of the assembler does is to to construct a org.springframework.security.core.userdetails.User object from the given UserEntity DTO. The code of the Assembler class is given below:<\/p>\n<pre class=\"brush:java\">package org.intan.pedigree.service;\r\n\r\nimport java.util.ArrayList;\r\n\r\nimport java.util.Collection;\r\n\r\nimport org.intan.pedigree.form.SecurityRoleEntity;\r\n\r\nimport org.intan.pedigree.form.UserEntity;\r\n\r\nimport org.springframework.security.core.GrantedAuthority;\r\n\r\nimport org.springframework.security.core.authority.GrantedAuthorityImpl;\r\n\r\nimport org.springframework.security.core.userdetails.User;\r\n\r\nimport org.springframework.stereotype.Service;\r\n\r\nimport org.springframework.transaction.annotation.Transactional;\r\n\r\n@Service('assembler')\r\n\r\npublic class Assembler {\r\n\r\n@Transactional(readOnly = true)\r\n\r\nUser buildUserFromUserEntity(UserEntity userEntity) {\r\n\r\nString username = userEntity.getUsername();\r\n\r\nString password = userEntity.getPassword();\r\n\r\nboolean enabled = userEntity.getActive();\r\n\r\nboolean accountNonExpired = userEntity.getActive();\r\n\r\nboolean credentialsNonExpired = userEntity.getActive();\r\n\r\nboolean accountNonLocked = userEntity.getActive();\r\n\r\nCollection authorities = new ArrayList();\r\n\r\nfor (SecurityRoleEntity role : userEntity.getSecurityRoleCollection()) {\r\n\r\nauthorities.add(new GrantedAuthorityImpl(role.getName()));\r\n\r\n}\r\n\r\nUser user = new User(username, password, enabled,\r\n\r\naccountNonExpired, credentialsNonExpired, accountNonLocked, authorities);\r\n\r\nreturn user;\r\n\r\n}\r\n\r\n}<\/pre>\n<p>The only thing that remain to be done now is to define what is necessary in the applicationContext-Security.xml. For this create a new xml file called \u201capplicationContext-Security.xml\u201d with the following contents:<\/p>\n<pre class=\"brush:xml\">&lt;?xml version='1.0' encoding='UTF-8'?&gt;\r\n&lt;beans:beans xmlns='http:\/\/www.springframework.org\/schema\/security'\r\n xmlns:beans='http:\/\/www.springframework.org\/schema\/beans' \r\n xmlns:xsi='http:\/\/www.w3.org\/2001\/XMLSchema-instance'\r\n  xmlns:context='http:\/\/www.springframework.org\/schema\/context'\r\n xsi:schemaLocation='http:\/\/www.springframework.org\/schema\/beans http:\/\/www.springframework.org\/schema\/beans\/spring-beans-3.0.xsd\r\n      http:\/\/www.springframework.org\/schema\/context http:\/\/www.springframework.org\/schema\/context\/spring-context.xsd\r\n                        http:\/\/www.springframework.org\/schema\/security http:\/\/www.springframework.org\/schema\/security\/spring-security-3.0.xsd'&gt;\r\n \r\n \r\n \r\n \r\n &lt;beans:bean id='userDetailsService' class='org.intan.pedigree.service.UserDetailsServiceImpl'&gt;&lt;\/beans:bean&gt;\r\n &lt;context:component-scan base-package='org.intan.pedigree' \/&gt;\r\n \r\n &lt;http auto-config='true'&gt;\r\n  &lt;intercept-url pattern='\/admin\/**' access='ROLE_ADMIN' \/&gt;\r\n  &lt;intercept-url pattern='\/user\/**' access='ROLE_REGISTERED_USER' \/&gt;\r\n  &lt;intercept-url pattern='\/kennel\/**' access='ROLE_KENNEL_OWNER' \/&gt;\r\n  &lt;!-- &lt;security:intercept-url pattern='\/login.jsp' access='IS_AUTHENTICATED_ANONYMOUSLY' \/&gt;  --&gt;\r\n &lt;\/http&gt;\r\n\r\n  &lt;beans:bean id='daoAuthenticationProvider'\r\n  class='org.springframework.security.authentication.dao.DaoAuthenticationProvider'&gt;\r\n  &lt;beans:property name='userDetailsService' ref='userDetailsService' \/&gt;\r\n &lt;\/beans:bean&gt;\r\n\r\n &lt;beans:bean id='authenticationManager'\r\n  class='org.springframework.security.authentication.ProviderManager'&gt;\r\n  &lt;beans:property name='providers'&gt;\r\n   &lt;beans:list&gt;\r\n    &lt;beans:ref local='daoAuthenticationProvider' \/&gt;\r\n   &lt;\/beans:list&gt;\r\n  &lt;\/beans:property&gt;\r\n &lt;\/beans:bean&gt;\r\n\r\n &lt;authentication-manager&gt;\r\n  &lt;authentication-provider user-service-ref='userDetailsService'&gt;\r\n   &lt;password-encoder hash='plaintext' \/&gt;\r\n  &lt;\/authentication-provider&gt;\r\n &lt;\/authentication-manager&gt;\r\n\r\n\r\n&lt;\/beans:beans&gt;\r\n<\/pre>\n<p>In your web.xml put the following code in order to load the applicationContext-security.xml file.<\/p>\n<pre class=\"brush:xml\"> &lt;context-param&gt;\r\n  &lt;param-name&gt;contextConfigLocation&lt;\/param-name&gt;\r\n  &lt;param-value&gt;\/WEB-INF\/applicationContext-hibernate.xml\r\n      \/WEB-INF\/applicationContext-security.xml\r\n  &lt;\/param-value&gt;\r\n &lt;\/context-param&gt;<\/pre>\n<p>Last of all, excuse any typing mistakes etc, as this code is just copy and paste from personal work that I have done, if something does not work please post the question and I will be more than happy to assist you. <\/p>\n<p><strong><i>Reference: <\/i><\/strong><a href=\"http:\/\/giannisapi.wordpress.com\/2011\/09\/21\/spring-3-spring-security-implementing-custom-userdetails-with-hibernate\/\">Spring 3, Spring Security Implementing Custom UserDetails with Hibernate<\/a> from our <a href=\"http:\/\/www.javacodegeeks.com\/p\/jcg.html\">JCG partner<\/a> Ioannis Dadis at the <a href=\"http:\/\/giannisapi.wordpress.com\/\">Giannisapi<\/a> blog.<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Most of the time, we will want to configure our own security access roles in web applications. This is easily achieved in Spring Security. In this article we will see the most simple way to do this. First of all we will need the following tables in the database: CREATE TABLE IF NOT EXISTS `mydb`.`security_role` &hellip;<\/p>\n","protected":false},"author":100,"featured_media":242,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[31,30,125],"class_list":["post-1690","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-enterprise-java","tag-jboss-hibernate","tag-spring","tag-spring-security"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Spring Security Implementing Custom UserDetails with Hibernate - Java Code Geeks<\/title>\n<meta name=\"description\" content=\"Most of the time, we will want to configure our own security access roles in web applications. This is easily achieved in Spring Security. In this article\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.javacodegeeks.com\/2012\/08\/spring-security-implementing-custom.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Spring Security Implementing Custom UserDetails with Hibernate - Java Code Geeks\" \/>\n<meta property=\"og:description\" content=\"Most of the time, we will want to configure our own security access roles in web applications. This is easily achieved in Spring Security. In this article\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2012\/08\/spring-security-implementing-custom.html\" \/>\n<meta property=\"og:site_name\" content=\"Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2012-08-13T16:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2012-10-22T06:30:36+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/spring-security-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Ioannis Dadis\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Ioannis Dadis\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/08\\\/spring-security-implementing-custom.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/08\\\/spring-security-implementing-custom.html\"},\"author\":{\"name\":\"Ioannis Dadis\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/d61318841fdb3cc6344ccbc8fbae1e0c\"},\"headline\":\"Spring Security Implementing Custom UserDetails with Hibernate\",\"datePublished\":\"2012-08-13T16:00:00+00:00\",\"dateModified\":\"2012-10-22T06:30:36+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/08\\\/spring-security-implementing-custom.html\"},\"wordCount\":396,\"commentCount\":4,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/08\\\/spring-security-implementing-custom.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/spring-security-logo.jpg\",\"keywords\":[\"JBoss Hibernate\",\"Spring\",\"Spring Security\"],\"articleSection\":[\"Enterprise Java\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/08\\\/spring-security-implementing-custom.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/08\\\/spring-security-implementing-custom.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/08\\\/spring-security-implementing-custom.html\",\"name\":\"Spring Security Implementing Custom UserDetails with Hibernate - Java Code Geeks\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/08\\\/spring-security-implementing-custom.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/08\\\/spring-security-implementing-custom.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/spring-security-logo.jpg\",\"datePublished\":\"2012-08-13T16:00:00+00:00\",\"dateModified\":\"2012-10-22T06:30:36+00:00\",\"description\":\"Most of the time, we will want to configure our own security access roles in web applications. This is easily achieved in Spring Security. In this article\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/08\\\/spring-security-implementing-custom.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/08\\\/spring-security-implementing-custom.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/08\\\/spring-security-implementing-custom.html#primaryimage\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/spring-security-logo.jpg\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/spring-security-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/08\\\/spring-security-implementing-custom.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Enterprise Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\\\/enterprise-java\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Spring Security Implementing Custom UserDetails with Hibernate\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Developers Resource Center\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.javacodegeeks.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/javacodegeeks\",\"https:\\\/\\\/x.com\\\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/d61318841fdb3cc6344ccbc8fbae1e0c\",\"name\":\"Ioannis Dadis\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2ebb60c8a0c366bddc1a20ad47e065b818a268e35ddbec0e0008eee6a7d78db2?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2ebb60c8a0c366bddc1a20ad47e065b818a268e35ddbec0e0008eee6a7d78db2?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2ebb60c8a0c366bddc1a20ad47e065b818a268e35ddbec0e0008eee6a7d78db2?s=96&d=mm&r=g\",\"caption\":\"Ioannis Dadis\"},\"sameAs\":[\"http:\\\/\\\/giannisapi.wordpress.com\\\/\"],\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/author\\\/Ioannis-Dadis\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Spring Security Implementing Custom UserDetails with Hibernate - Java Code Geeks","description":"Most of the time, we will want to configure our own security access roles in web applications. This is easily achieved in Spring Security. In this article","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.javacodegeeks.com\/2012\/08\/spring-security-implementing-custom.html","og_locale":"en_US","og_type":"article","og_title":"Spring Security Implementing Custom UserDetails with Hibernate - Java Code Geeks","og_description":"Most of the time, we will want to configure our own security access roles in web applications. This is easily achieved in Spring Security. In this article","og_url":"https:\/\/www.javacodegeeks.com\/2012\/08\/spring-security-implementing-custom.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2012-08-13T16:00:00+00:00","article_modified_time":"2012-10-22T06:30:36+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/spring-security-logo.jpg","type":"image\/jpeg"}],"author":"Ioannis Dadis","twitter_card":"summary_large_image","twitter_creator":"@javacodegeeks","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Ioannis Dadis","Est. reading time":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2012\/08\/spring-security-implementing-custom.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/08\/spring-security-implementing-custom.html"},"author":{"name":"Ioannis Dadis","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/d61318841fdb3cc6344ccbc8fbae1e0c"},"headline":"Spring Security Implementing Custom UserDetails with Hibernate","datePublished":"2012-08-13T16:00:00+00:00","dateModified":"2012-10-22T06:30:36+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/08\/spring-security-implementing-custom.html"},"wordCount":396,"commentCount":4,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/08\/spring-security-implementing-custom.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/spring-security-logo.jpg","keywords":["JBoss Hibernate","Spring","Spring Security"],"articleSection":["Enterprise Java"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javacodegeeks.com\/2012\/08\/spring-security-implementing-custom.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2012\/08\/spring-security-implementing-custom.html","url":"https:\/\/www.javacodegeeks.com\/2012\/08\/spring-security-implementing-custom.html","name":"Spring Security Implementing Custom UserDetails with Hibernate - Java Code Geeks","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/08\/spring-security-implementing-custom.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/08\/spring-security-implementing-custom.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/spring-security-logo.jpg","datePublished":"2012-08-13T16:00:00+00:00","dateModified":"2012-10-22T06:30:36+00:00","description":"Most of the time, we will want to configure our own security access roles in web applications. This is easily achieved in Spring Security. In this article","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/08\/spring-security-implementing-custom.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2012\/08\/spring-security-implementing-custom.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2012\/08\/spring-security-implementing-custom.html#primaryimage","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/spring-security-logo.jpg","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/spring-security-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.javacodegeeks.com\/2012\/08\/spring-security-implementing-custom.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Java","item":"https:\/\/www.javacodegeeks.com\/category\/java"},{"@type":"ListItem","position":3,"name":"Enterprise Java","item":"https:\/\/www.javacodegeeks.com\/category\/java\/enterprise-java"},{"@type":"ListItem","position":4,"name":"Spring Security Implementing Custom UserDetails with Hibernate"}]},{"@type":"WebSite","@id":"https:\/\/www.javacodegeeks.com\/#website","url":"https:\/\/www.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Developers Resource Center","publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/d61318841fdb3cc6344ccbc8fbae1e0c","name":"Ioannis Dadis","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/2ebb60c8a0c366bddc1a20ad47e065b818a268e35ddbec0e0008eee6a7d78db2?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/2ebb60c8a0c366bddc1a20ad47e065b818a268e35ddbec0e0008eee6a7d78db2?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/2ebb60c8a0c366bddc1a20ad47e065b818a268e35ddbec0e0008eee6a7d78db2?s=96&d=mm&r=g","caption":"Ioannis Dadis"},"sameAs":["http:\/\/giannisapi.wordpress.com\/"],"url":"https:\/\/www.javacodegeeks.com\/author\/Ioannis-Dadis"}]}},"_links":{"self":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/1690","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/users\/100"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=1690"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/1690\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media\/242"}],"wp:attachment":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=1690"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=1690"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=1690"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}