ZK + рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ + рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдореЗрдВ рд╕реНрдкреНрд░рд┐рдВрдЧ рд╕рд┐рдХреНрдпреЛрд░рд┐рдЯреА рдХреА рддреИрдирд╛рддреА: рднрд╛рдЧ рджреЛ

рд╕рднреА рдХреЛ рд╢реБрдн рджрд┐рдиред рдпрд╣ рдЖрд▓реЗрдЦ рдПрдХ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд▓реЗрдЦ рдХрд╛ рдПрдХ рдирд┐рд░рдВрддрд░рддрд╛ рд╣реИред рд╣рдо рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЛ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрдВрдЧреЗ, рдЬрд┐рд╕рдХрд╛ рд╡рд░реНрдгрди рдкрд┐рдЫрд▓реА рдФрд░ рдЗрд╕ рдкреЛрд╕реНрдЯ рджреЛрдиреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдХрд╛рд░реНрдп рдпреЛрдЬрдирд╛:


рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЙрди рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВрдЧреЗ рдЬрд┐рдирдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдФрд░ рдЙрдирдХреА рднреВрдорд┐рдХрд╛рдУрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЕрд░реНрдерд╛рддреН: рдЖрдИрдбреА рдлрд╝реАрд▓реНрдб рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред рдФрд░ USER_ROLE рдирд╛рдордХ рдПрдХ рдирдИ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдПрдБред
CREATE TABLE user_role (id NUMBER NOT NULL, name VARCHAR2(10 BYTE) NOT NULL) 

рд╣рдо рдмрдВрдбрд▓ M: 1 рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рднреА рдмрдирд╛рддреЗ рд╣реИрдВ, рдЗрд╕реЗ user_role_list рдХрд╣рддреЗ рд╣реИрдВ
 CREATE TABLE user_role_list (id_user NUMBER NOT NULL, id_role NUMBER NOT NULL) 

рд╣рдо рдорд╛рдирдЪрд┐рддреНрд░рдг рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд░реНрдЧ рдмрдирд╛рдПрдБ:
 package com.sample.data; import java.io.Serializable; import java.util.Set; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.Id; import javax.persistence.OneToMany; import javax.persistence.Table; @Entity @Table(name = "USERS") public class User implements Serializable { private static final long serialVersionUID = 1L; @Id private long id; @Column(name = "USERNAME") private String username; @Column(name = "PASSWORD") private String password; @OneToMany(mappedBy = "user", fetch = FetchType.LAZY) Set<Role> roleList; public long getId() { return id; } public void setId(long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Set<Role> getRoleList() { return roleList; } public void setRoleList(Set<Role> roleList) { this.roleList = roleList; } } 


рд╣рдореЗрдВ рднреВрдорд┐рдХрд╛ рд╡рд░реНрдЧ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:
 package com.sample.data; import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToOne; import javax.persistence.Table; @Entity @Table(name = "USER_ROLE") public class Role implements Serializable { private static final long serialVersionUID = 1L; @Id private long id; @Column(name = "NAME") private String name; @ManyToOne(fetch = FetchType.LAZY) @JoinTable(name = "USER_ROLE_LIST", joinColumns = @JoinColumn(name = "ID_ROLE"), inverseJoinColumns = @JoinColumn(name = "ID_USER")) private User user; public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } } 

рдХреЛрдб рдкрд░ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг: рдПрдиреЛрдЯреЗрд╢рди @JoinTable(name = "USER_ROLE_LIST", joinColumns = @JoinColumn(name = "ID_ROLE"), inverseJoinColumns = @JoinColumn(name = "ID_USER")) , рд╣рдордиреЗ рдЗрд╕ рддрд░рд╣ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИред USER_ROLE_LIST рдлрд╝реАрд▓реНрдб ID_USER рдФрд░ ID_ROLE рдХреЗ рд╕рд╛рдеред
рд╣рд╛рдЗрдмрд░рдиреЗрдЯ- config.xml рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рднреА рдЬреЛрдбрд╝реЗрдВ:
 <mapping class="com.sample.data.User" /> <mapping class="com.sample.data.Role" /> 

рдпреЛрдЬрдирд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдо рдЕрдкрдиреЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдлрд╝реЙрд░реНрдо рдХреЛ рдмрджрд▓ рджреЗрдВрдЧреЗ, рдпрд╛ рдпреВрдБ рдХрд╣реЗрдВ рдХрд┐ jsp рдкреГрд╖реНрда рдХреЗ рдмрдЬрд╛рдп, рдПрдХ zk рдкреГрд╖реНрда рдмрдирд╛рдПрдБ, рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░реЗрдВред рд╣рдо рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдЗрдирдкреБрдЯ рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рд╕реВрдЪреА рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЪрдпрди рдХрд░реЗрдВрдЧреЗред рд╣рдо index.zul рдлрд╝рд╛рдЗрд▓ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ WebContent рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВ
 <?page id="testZul" title=" "?> <window title="" border="normal" width="500px" mode="modal" position="center" use="ui.component.Login" id="wndLogin"> <html style="color:red" if="${not empty param.login_error}"> <![CDATA[   ,   ,   <br/><br/> <!-- Reason: --> <!-- ${SPRING_SECURITY_LAST_EXCEPTION.message} --> ]]> </html> <groupbox> <h:form id="f" name="f" action="j_spring_security_check" method="POST" xmlns:h="http://www.w3.org/1999/xhtml"> <grid> <rows> <row> : <combobox id="cbUser" name="j_username" hflex="1" value="" /> </row> <row> : <textbox id="p" type="password" name="j_password" hflex="1" value="" /> </row> <row visible="false"> <checkbox id="r" name="_spring_security_remember_me" /> </row> <row spans="2"> <vbox align="center" hflex="1"> <hbox> <h:input type="submit" value="" /> <h:input type="reset" value="" /> </hbox> </vbox> </row> </rows> </grid> </h:form> </groupbox> </window> 

рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдЕрдкрдиреЗ рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рд▓рд╛рдЗрди рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рд╣реИ = "ui.component.Login"
 package ui.component; import java.util.List; import javax.servlet.ServletContext; import org.springframework.context.ApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; import org.zkoss.zul.Combobox; import org.zkoss.zul.Window; import com.sample.data.User; import com.sample.service.ISecur; public class Login extends Window { private static final long serialVersionUID = 3974533449164635181L; private ISecur userDao; private Combobox cbUser; private List<User> listUser; public void onCreate() { ApplicationContext ctx = WebApplicationContextUtils. getRequiredWebApplicationContext((ServletContext) getDesktop().getWebApp() .getNativeContext()); userDao = (ISecur) ctx.getBean("securImpl"); cbUser = (Combobox) this.getFellow("cbUser"); onOpenCB(); } public void onOpenCB() { if (listUser == null || listUser.size() == 0) { listUser = userDao.findAllUsers(); for (User pers : listUser) { cbUser.appendItem(pers.getUsername()); } } } } 

рд╣рдо рдЯреЗрдмрд▓ USERS, USER_ROLE_LIST рдФрд░ USER_ROLE рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд┐рдЦрддреЗ рд╣реИрдВред
ISecur рдЗрдВрдЯрд░рдлрд╝реЗрд╕:
 package com.sample.service; import java.util.List; import com.sample.data.User; public interface ISecur { List<User> findAllUsers(); } 

SecurImpl рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
 package com.sample.service; import java.util.List; import org.hibernate.SessionFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; import com.sample.data.User; @Repository @Transactional(readOnly = true) public class SecurImpl implements ISecur { private static SessionFactory sessionFactory; //   datasource @Autowired public void setSessionFactory(SessionFactory sessionFactory) { SecurImpl.sessionFactory = sessionFactory; } @SuppressWarnings("unchecked") @Override public List<User> findAllUsers() { return (List<User>) sessionFactory.getCurrentSession().createQuery("from User").list(); } } 

рдЕрдЧрд▓рд╛ рдФрд░ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрджрдо AbstractUserDetailsAuthenticationProvider рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ рд╣реИред рдпрд╣ рдирдпрд╛ рд╡рд┐рд░рд╛рд╕рдд рд╡рд╛рд▓рд╛ рд╡рд░реНрдЧ, рдЗрд╕реЗ MyDaoAuthenticationProvider рдХрд╣рддреЗ рд╣реИрдВ, рдЗрд╕рдореЗрдВ рд╣рдорд╛рд░реЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХрд╛ рддрд░реНрдХ рд╣реЛрдЧрд╛:
 package com.sample.service; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.List; import java.util.Set; import org.springframework.context.annotation.Bean; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.GrantedAuthorityImpl; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; import com.sample.data.Role; @SuppressWarnings("deprecation") @Service("myDaoAuthenticationProvider") public class MyDaoAuthenticationProvider extends AbstractUserDetailsAuthenticationProvider { @Bean public ISecur userDao() { return new SecurImpl(); } public Authentication authenticate(Authentication authentication) throws AuthenticationException { System.out.println(authentication.getName() + " " + new Date()); return super.authenticate(authentication); } @Override protected void additionalAuthenticationChecks(UserDetails arg0, UsernamePasswordAuthenticationToken arg1) throws AuthenticationException { } @Override protected UserDetails retrieveUser(String username, UsernamePasswordAuthenticationToken userInfo) throws AuthenticationException { List<com.sample.data.User> listUser = userDao().findAllUsers(); User user; if (listUser.size() == 0) { throw new UsernameNotFoundException("    "); } com.sample.data.User person = getUser(listUser, username); if(person.getPassword().equals(userInfo.getCredentials().toString())) { user = new User(person.getUsername(), userInfo.getCredentials().toString(), true, true, true, true, getAuthorities((Set<Role>) person.getRoleList())); } else { user = new User(person.getPassword(), userInfo.getCredentials().toString(), true, true, true, false, getAuthorities("IS_AUTHENTICATED_ANONYMOUSLY")); } return user; } private com.sample.data.User getUser(List<com.sample.data.User> lp, String userName) { com.sample.data.User pers = null; for (com.sample.data.User p : lp) { if (userName.equals(p.getUsername())) { pers = p; } } return pers; } private Collection<GrantedAuthority> getAuthorities(Set<Role> set) { Collection<GrantedAuthority> authList = new ArrayList<GrantedAuthority>(); for (Role role : set) { authList.add(new GrantedAuthorityImpl(role.getName())); } return authList; } private Collection<GrantedAuthority> getAuthorities(String grant_name) { Collection<GrantedAuthority> authList = new ArrayList<GrantedAuthority>(); authList.add(new GrantedAuthorityImpl(grant_name)); return authList; } } 

рдЬрдм "рд▓реЙрдЧрд┐рди" рдмрдЯрди рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд┐рдП рдЧрдП UserDetails рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕ рдкрджреНрдзрддрд┐ рдореЗрдВ, рд╣рдо рдЪреБрдиреЗ рд╣реБрдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрддреНрд░рд╛рдЪрд╛рд░ рдХреА рддреБрд▓рдирд╛ рджрд░реНрдЬ рдХрд┐рдП рдЧрдП рдкрд╛рд╕рд╡рд░реНрдб рд╕реЗ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрджрд┐ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ, рддреЛ рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд░реНрдЧ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ UserDetails рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ (рдЙрд╕рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо, рдкрд╛рд╕рд╡рд░реНрдб рдФрд░ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреА рд╕реВрдЪреА) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрдЧреАред
рдЕрдм рд╣рдо AuthenticationManager рдХреЛ рдмрддрд╛рдПрдВрдЧреЗ рдХрд┐ рд╣рдореЗрдВ рдкреНрд░рджрд╛рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдорд╛рд░реЗ MyDaoAuthenticationProvider рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдмрдЬрд╛рдп рд╡рд╕рдВрдд-config.xml рдлрд╝рд╛рдЗрд▓ рдореЗрдВ:
 <security:authentication-manager> <security:authentication-provider> <security:jdbc-user-service data-source-ref="dataSource" /> </security:authentication-provider> </security:authentication-manager> 

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рд┐рдЦреЗрдВ:
 <security:authentication-manager> <security:authentication-provider ref="userDetailsService"> </security:authentication-provider> </security:authentication-manager> 

Http рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рднреА рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдЬреЛ рдпрд╣рд╛рдВ рд╡рд░реНрдгрд┐рдд рд╣реИ :
 <security:http auto-config="true" use-expressions="true"> <security:intercept-url pattern="/index.zul" access="hasRole('ROLE_USER') or hasRole('ROLE_ADMIN')" /> <security:intercept-url pattern="/login.zul" access="permitAll" /> <security:form-login login-page="/login.zul" always-use-default-target="true" default-target-url="/index.zul" authentication-failure-url="/login.zul?login_error=1" /> </security:http> 

рд╡рд╣ рд╕рдм рд╣реИ! рдпрджрд┐ рд╣рдо рдЕрдкрдирд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдПрдХ рд╕реБрдВрджрд░ рд▓реЙрдЧрд┐рди рдлрд╝реЙрд░реНрдо рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдбреНрд░реЙрдк-рдбрд╛рдЙрди рд╕реВрдЪреА рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реЛрдЧреАред
рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рд╕рднреА рдХрд╛ рдзрдиреНрдпрд╡рд╛рджред


Source: https://habr.com/ru/post/In129733/


All Articles